2013-08-23 2 views
0

mysql에서 간단한 키워드 비교 쿼리를 작성하려고했지만 어떤 이유로 모든 숫자 키워드가 모든 숫자 검색 용어와 일치하지 않습니다.mysql 문자열과 숫자가 동일하지 않음

제품 표, 키워드 테이블 및 조인 테이블이 있습니다. 일을 더 간단하게하기 위해 제품 ID 당 키워드 문자열의 간단한 목록을 제공하는 조인을 수행하는보기를 사용하고 있습니다. 1 제품에는 특히 "John", "Deere", "8000", "Midroller"라는 4 개의 키워드가 있으며이 키워드는보기 및 결합시 올바르게 표시됩니다.

"8000"키워드의 경우 (keyword = "8000") 절대로 사실이 아닙니다.

SELECT a.id, kw.keyword AS keyword, (kw.keyword = 'John' OR 
    kw.keyword = 'Deere' OR 
    kw.keyword = "8000" OR 
    kw.keyword = 'Midroller') AS matched 
FROM `kc5n2_product` AS a 
INNER JOIN `product_keywords` AS kw ON a.id = kw.product 
WHERE a.id =119 

반환

 
id keyword matches 
119 8000  0 
119 John  1 
119 Deere  1 
119 Midroller 1 

나는 이것 좀 했어 : MySql: Compare 2 strings which are numbers? 하지만 정말 도움이되지 않았다.

나는 또한 MySQL Query doesn't seem to be outputting expectations을 발견했으나 숫자가 아닌 문자열로 비교하려고 노력하고 있습니다.

심지어 문자열이 전혀 도움이되지 않았다 모두로 해석 mysql을 강제하려고
SELECT a.id, kw.keyword AS keyword, (CAST(kw.keyword as Char(4)) = CAST("8000" as Char(4))) AS matched 

을 시도.

은 내가

kw.keyword LIKE "%8000%" 

를 사용하지만 나는 매우 제한적인 검색을 유지하려는 수있는이 단계에서 같은 경우 내가 좋아하는을 피하기 위해 원합니다 경우가 검색어와 일치하는 것을 발견했다.

분명히 내가 잘못하고있는 것이 있습니까?

+0

'8000'을 (를) 포함하는 행의 앞/뒤에 공백이있을 수 있습니다. – peterm

+0

맞습니다! 여분의 공간은 phpmyadmin에 표시되지 않았으므로 확인하지도 않았습니다. 그것은 매우 기본적인 것이 었습니다. – DigitalArchitect

답변

0

이와 같은 경우 대개 "오작동"값에 선행/후행 공백이 있음을 의미합니다.

당신은 여기이

SELECT * 
    FROM keywords 
WHERE CHAR_LENGTH(keyword) <> CHAR_LENGTH(TRIM(keyword)) 

같은 쿼리로 모든 "나쁜"기록을 찾을 수 있습니다

SQLFiddle 데모

입니다 그리고 당신은 분명이

같은 간단한 업데이트로 문제를 해결할 수 있습니다
UPDATE keywords 
    SET keyword = TRIM(keyword) 
WHERE CHAR_LENGTH(keyword) <> CHAR_LENGTH(TRIM(keyword)) 

여기에 SQLFiddle 데모

0

게시 한 내용이 이상하지 않습니다. 테스트 케이스를 설정했습니다.

CREATE TABLE product (id INT); 
CREATE TABLE product_keywords (product INT, keyword VARCHAR(32)); 

INSERT INTO product 
    VALUES (19),(20); 
INSERT INTO product_keywords 
    VALUES (19,'Foo'),(19,'John'),(19,'Deere'),(19,'8000'),(19,'Midroller'); 

SELECT a.id 
    , kw.keyword AS keyword 
    , (kw.keyword = 'John' OR 
     kw.keyword = 'Deere' OR 
     kw.keyword = "8000" OR 
     kw.keyword = 'Midroller' 
     ) AS matched 
    FROM `product` a 
    JOIN `product_keywords` kw 
    ON a.id = kw.product 
WHERE a.id = 19 

    id keyword matched 
------ --------- ------- 
    19 Foo    0 
    19 John    1 
    19 Deere   1 
    19 8000    1 
    19 Midroller  1 

(이중 따옴표가 아닌 8000 리터럴에 작은 따옴표를 사용 하겠지만 기본 MySQL 구성에서는 차이가 없습니다.)

아마도 뷰 쿼리에 문제가있을 수 있습니다.

이 쿼리는 무엇을 반환합니까?

SELECT kw.* FROM product_keywords kw WHERE kw.product = 119 ORDER BY kw.keyword ; 
+0

네 개의 키워드를 모두 올바르게 반환합니다. 그것을 알아 낸 @peterm, 나는 약간 짜증나. 그것은 그렇게 단순한 것이었다. – DigitalArchitect

관련 문제