2012-01-21 2 views
1

DB는 MySQL입니다. 제대로 작동하지SQL "in"문

select * from table1 
id column1 
-- -------- 
1 3,4,5 
2 3,7,8 

및 SQL : 나는 테이블의 구조를 잘 작성하지 것을 알고

SELECT * FROM table1 WHERE 3 in (column1) 

하나 개 아래로 보여 구조 테이블이있다. 그러나 그것은 나보다 먼저 행해졌 다. 이런 식으로 나에게 무엇을 제안 할 수 있습니까? 또는이 SQL의 의미를 수행 할 것인가? 감사.

+2

'FIND_IN_SET()'함수를 사용하십시오. 그러나 당신이 당신의 테이블을 정상화시킬 때까지만. –

+2

쉼표로 구분 된 값을 db 열에 저장하는 것은 결코 좋지 않습니다. [나쁘지 않니?] (http://stackoverflow.com/questions/3653462/is-storing-a-comma-separated-list-in-a-database- 열 진짜 - 그 - 나쁜) –

+0

쿼리에서 가져 오려는 무엇입니까? – Lucifer

답변

6

이 테이블을 정상화하십시오 원하는 것 같습니다. 읽기 이유는 storing comma separated values in a db column is really bad입니다. 당신이 허용되지 않는 경우

사용 FIND_IN_SET() 기능 :

SELECT * 
FROM table1 
WHERE FIND_IN_SET(3, column1) 
+0

나는 그것이 나쁘다는 것을 안다. 이 구조는 전에 만들어졌고 테이블을 정규화하여 응용 프로그램에서 많은 SQL 문을 변경해야합니다. 고맙습니다, ypercube. 그리고 한가지 더 질문 해주세요 :) FIND_IN_SET()은 '%, 3, %'와 같은 LIKE를 사용하는 것보다 낫습니다 (처음부터 끝까지 쉼표를 추가 한 후)? 이 표에는 500.000 개가 넘는 레코드가 있기 때문입니다. –

+0

500K 행을 사용하면 속도가 느려집니다. 테스트를해야하지만'FIND_IN_SET()'이'CONCAT' +'LIKE' 또는'LIKE OR LIKE'보다 빠르다고 생각합니다. –

1

그것은 당신이

SELECT * FROM table1 WHERE column1 LIKE "%,3,%" OR column1 LIKE "3,%" OR column1 LIKE "%,3" 
0

IN이 왼쪽 피연산자가 하나의 열 하위 쿼리의 경우에 의해 반환 된 값 중 하나에 있는지를 비교하는 데 사용하는 연산자 당신은 WHERE 3,4,5 IN (1 열)를 사용하는 것이다 당신에 사용할

1

사용 find_in_set 그것은 쉼표로 구분 된 값

,941의 문자열 값의 위치를 ​​반환