2009-10-15 5 views
1

여러 값을 수집하는 두 개의 필드가있는 데이터베이스가 있습니다. 예를 들어, 하나는 색상이고, 한 행은 "red, blue, navyblue, lightblue, orange" 일 수 있습니다. 다른 필드는 숫자를 사용하며 colorID라고합니다. 하나의 행이 "1, 10, 23, 110, 239."LIKE % ... %로 mySql을 쿼리하고 거짓 레코드를 가져 오지 않음

이 될 것입니다. 이제 SELECT * FROM my_table WHERE 'colors' LIKE %blue%;으로 쿼리를 실행하면 모든 행에 파란색이 표시되지만 행에 "navyblue "또는"lightblue "를 포함 할 수도 있고 포함하지 않을 수도 있습니다. 마찬가지로, colorID를 사용하면 WHERE 'colorID' LIKE %1%에 대한 쿼리가 원하는 것보다 훨씬 많은 행을 가져옵니다.

데이터베이스를 올바르게 쿼리하고 올바른 결과 만 반환하는 올바른 구문은 무엇입니까? FWIW 필드는 모두 쉼표로 인해 TEXT로 설정됩니다. 더 쉽고 정확하게 검색 할 수있는 데이터를 저장하는 더 좋은 방법이 있습니까?

+1

올바른 결과는 무엇입니까? 또한 ID를 유지하는 경우에는 정수 C 럼 및 별도의 테이블을 사용하고 조인을 사용하여 ID를 u 리해야합니다. –

답변

6

정말 DB 스키마를 변경해야합니다. 하나의 옵션은 INT를 기본 키로 사용하여 색상을 유지하는 테이블을 만드는 것입니다. 그런 다음 색상 MY_TABLE 연결하는 피벗 테이블을 만들 수

CREATE TABLE `colours` (
`id` INT NOT NULL , 
`colour` VARCHAR(255) NOT NULL , 
PRIMARY KEY (`id`) 
) ENGINE = MYISAM 

CREATE TABLE `mytable_to_colours` (
`mytable_id` INT NOT NULL , 
`colour_id` INT NOT NULL , 
) ENGINE = MYISAM 

그래서 다음과 같이 할 수 쿼리 - '1'파랑의 값입니다 (당신이 그것을 참조하는 것이 얼마나 가능성)

SELECT * 
    FROM my_table 
    JOIN mytable_to_colours ON (my_table.id = mytable_to_colours.mytable_id) 
    WHERE colour_id = '1' 
+0

@rexem 좋은 캐치! 이제 SQL을 수정했습니다 – robjmills

+0

절대적으로 맞습니다. 쿼리하려는 경우 데이터를 쉼표로 구분 된 목록에 저장하면 안됩니다. – HLGEM

3

당신은 당신의 기존 테이블에 검색하려면 다음 쿼리를 사용할 수 있습니다

SELECT * 
FROM my_table 
WHERE colors LIKE 'blue,%' 
    OR colors LIKE '%,blue' 
    OR colors LIKE '%,blue,%' 
    OR colors = 'blue' 

당신이 테이블 colors 및을 만들 때보다 훨씬 낫다 그러나이및 많은 관계를 만듭니다.

EDITED : @seengee와 닮았습니다.

1

MySQL에는 "[^ a-z] blue |^blue"와 (와) 일치시킬 수있는 REGEXP 기능이 있습니다. 그러나 정말로 이런 식으로하지 않는 것이 좋습니다. 공통 ID로 그룹화 가능한 여러 행이있는 각 색상에 대해 하나의 행을 포함하는 단일 테이블은 훨씬 더 확장 성이 좋습니다.

0

아마도이 당신에게 도움이 될 것입니다

SELECT * FROM table WHERE column REGEXP "[X]"; // where X is a number. returns all rows containg X in your column 
SELECT * FROM table WHERE column REGEXP "^[X]"; // where X is a number. returns all rows containg X as first number in your column 

행운을 빕니다!

1

표준 답변은이 테이블에 colorSelID (또는 기타)를 넣은 다음 'colorSelID'에서 개별 colorID로 매핑하는 두 개의 열이있는 다른 테이블을 사용하여 데이터를 정규화하여 위의 데이터가 무엇인가 : 당신이 colorID (10)과 일치하는 모든 항목을 찾을하려는 경우, 당신은 단지 colorID 검색, 그리고

colorSelId | ColorId 
1   | 1 
1   | 10 
1   | 23 
1   | 110 
1   | 239 

, 그리고 :

other colums | colorSelId 
other data | 1 

그런 다음 색상 표에, 당신은 할 것 ColorSelId를 주 테이블에 다시 결합하여 모든 항목을 가져옵니다. 10 colorID :

select * 
from 
    main_table join color_table 
on 
    main_table.ColorSelId=color_table.ColorSelId 
where 
    color_table.colorId = 10 

편집 :이 기본 테이블도 아마 많이 귀하의 검색 속도를 적어도 색상 표에 ColorId에 당신에게 인덱스를 가정하고 ColorSelId 않습니다. '% x %'에 대한 검색은 전체 테이블 스캔을 항상 수행하지만 인덱스를 사용합니다 (거의?).

0

귀하의 질문을 이해한다고 가정 할 때 지금까지 제안 된 해결책 중 어느 것도 작동하지 않을 것으로 보입니다. 테이블에 쉼표로 구분 된 문자열을 분할 및 결합의 짧은,이 (예를 들어 사용하는 '블루')을 수행 할 수 있습니다

WHERE ', ' + myTable.ValueList + ',' LIKE '%, blue,%' 

를 쉼표 후 공간에 대한 세심한 아닌 경우에 필요 ValueList의 공백을이 코드의 일부로 빈 문자열로 바꾸십시오 (그리고 ','의 공백을 제거하십시오).

관련 문제