2014-07-08 2 views
0

ID 목록에서 하나의 ID를 찾을 수있는 쿼리를 실행하고 싶습니다.mysql 쿼리 "WHERE 2 IN (`column`)"이 작동하지 않습니다.

테이블 user

id_user | name | id_site 
------------------------- 
1  | james | 1, 2, 3 
1  | brad | 1, 3 
1  | suko | 4, 5 

내 쿼리 (작동하지 않습니다)

SELECT * FROM `user` WHERE 3 IN (`id_site`) 

이 쿼리 작업 (하지만 일을하지 않는 것은)

SELECT * FROM `user` WHERE 3 IN (1, 2, 3, 4, 6) 
+0

id_site의 유형은 무엇입니까? –

+1

WHERE 열 IN (.. 값 ..). 3은 열이 아닙니다. –

+2

'3'은 열의 값이 아닙니다. 값은''1, 2, 3 "',''1, 3"'및''4,5 "'입니다. '3'입니다. –

답변

5

그건 어떻게 IN 작동하지 않습니다. 난 그냥 read the docs

이 시도 이유를 설명 방해 할 수 없습니다이 1,2,3, 1,34,5 (즉, 공백)은없는 데이터를 필요로

SELECT * FROM `user` WHERE FIND_IN_SET(3,`id_site`) 

하는 것으로. 이 옵션이 아니면 다음을 시도하십시오.

SELECT * FROM `user` WHERE FIND_IN_SET(3,REPLACE(`id_site`,' ','')) 

또는 데이터베이스를 재구성하십시오. 즉 :

CREATE TABLE `user_site_links` (
    `id_user` INT UNSIGNED NOT NULL, 
    `id_site` INT UNSIGNED NOT NULL, 
    PRIMARY KEY (`user_id`,`site_id`) 
); 
INSERT INTO `user_site_links` VALUES 
    (1,1), (1,2), (1,3), 
    (2,1), (2,3), 
    (3,4), (3,5); 
SELECT * FROM `user` JOIN `user_site_links` USING (`id_user`) WHERE `id_site` = 3; 
0

문제는 여러 목록에서 검색하는 것입니다. 그러나

SELECT * FROM `user` WHERE id_site LIKE '%3%'; 

,도 33, 333 및 345은 그래서 당신은 좀 더 고급 텍스트 분석을 원하는 선택하게됩니다

당신은 더 뭔가를해야합니다.

0

WHERE IN 절은 많은 OR 조건을 대체하는 데 유용합니다. exemple

SELECT * FROM `user` WHERE id IN (1,2,3,4) 

를 들어 당신은 단지 잘못된 방법으로 그것을 사용하려는 청소기에 비해

SELECT * FROM `user` WHERE id=1 OR id=2 OR id=3 OR id=4 

입니다.

올바른 방법 :

WHERE `field` IN (list_item1, list_item2 [, list_itemX]) 
+0

"reverse IN"(즉,''WHERE value IN ('column1','column2')'')은 틀림없이 haxy이지만 작동합니다 - 저는 그것을 사용합니다 때로는 두 명의 사용자가 관련되어있을 때 "123 IN ('sender','recipient')' –

+0

팁을 주셔서 감사합니다. – Betezed

2

NO!관계 데이터베이스의 경우

("각 속성은 원자 값을 포함하고, 각 속성의 값이 해당 도메인에서 단 하나의 값이 들어") 데이터베이스와의를 first normal form 위로하지 않습니다 테이블 :

  • 사용 문자열 필드는 하나 개의 필드에 숫자를
  • 저장 여러 값을 포함하는

이와 같은 작업을하려면 FIND_IN_SET()을 사용하거나 ,1,2,3, (콜론이나 세미콜론 또는 기타 구분 기호를 맨 앞에 사용)과 같은 데이터를 저장하고 모든 경우에 작동하려면 LIKE "%,7,%"을 사용해야합니다. 이 방법 인덱스를 사용할 수 없습니다[1][2].

Use relation table to do this

:

CREATE TABLE user_on_sites(
    user_id INT, 
    site_id INT, 
    PRIMARY KEY (user_id, site_id), 
    INDEX (user_id), 
    INDEX (site_id) 
); 

그리고 join tables :

SELECT u.id, u.name, uos.site_id 
FROM user_on_sites AS uos 
INNER JOIN user AS u ON uos.user_id = user.id 
WHERE uos.site_id = 3; 

이 방법 당신은 efficientlyusing indexes를 검색 할 수 있습니다.

+0

'user_on_sites' 테이블에'PRIMARY KEY (user_id, site_id)'를 추가하여 중복 링크가 없도록하고 싶지만 내가 말하고자하는 모든 것을 말했지만 훨씬 더 명확한 XD –

+0

을 말하십시오. 그건 내가 말한 것이 아니야. 추가 한 것은 유용하지 않으며 중복 링크를 막지 않습니다. –

+0

@NiettheDarkAbsol 내 나쁜,'find_in_set'과'like' (나는 b-trees가'LIKE " %"'표현식에 대해 작동 할 수 있다는 것에 놀랐다. 키. – Vyktor