2011-09-13 5 views
9

동일한 필드의 두 개 이상의 값을 만족시키는 항목을 연관 테이블에서 선택하려고하는데, 혼란 스럽지만 설명해 드리겠습니다.MySQL 컬럼을위한 특정 값이 여러 개인 다른 행에있는 ID를 선택하십시오.

+-----------------------+ 
| item_id | category_id | 
+-----------------------+ 
| 1  | 200  | 
| 1  | 201  | 
| 1  | 202  | 
| 2  | 201  | 
| 2  | 202  | 
| 3  | 202  | 
| 3  | 203  | 
| 4  | 201  | 
| 4  | 207  | 
+-----------------------+ 

표에서 내가 통과 한 범주에있는 항목 만 선택할 수 있기를 원합니다. 예를 들어 카테고리 ID 201과 202를 전달하면 두 카테고리에있는 항목 만 원할 것입니다 (다른 카테고리를 가질 수는 있지만 적어도 쿼리하는 범주에 있어야합니다).이 경우, 나는 그들이 카테고리 (201)에 있고 202

내 초기 SQL 문이 작동하지 않습니다 분명히

SELECT * FROM item_category WHERE category_id = 201 AND category_id = 202; 

하지만 뭔가를했던 유일한 사람은 오직 이후 항목 1과 2를 원하는 것입니다.

SELECT * FROM item_category WHERE category_id = 201 OR category_id = 202; 

위의 쿼리는 항목 4와 3도 반환하기 때문에 작동하지 않습니다.

그래서 적어도 두 범주에 속해야하는 항목 만 선택하면 어떻게됩니까?

두 개 이상의 카테고리 ID를 전달할 수 있습니다.

는 당신의 도움을 주셔서 감사합니다.

답변

8

WHERE 절의 표현식은 단일 행의 조인 된 결과 집합에 대해 작동합니다. 그렇기 때문에 이 작동하지 않습니다. 단일 행의 두 값일 수 없기 때문입니다.

그래서 테이블의 두 행을 결과 집합의 한 행으로 결합하는 방법이 필요합니다. 당신은 자체 조인하여이 작업을 수행 할 수 있습니다

SELECT c1.item_id 
FROM item_category AS c1 
INNER JOIN item_category AS c2 ON c1.item_id = c2.item_id 
WHERE c1.category_id = 201 AND c2.category_id = 202 

이 기술은 당신이 셋, 넷, 다섯 개 이상의 값을 검색 할 때 조인 N-1이 필요하기 때문에, 확장하기 어렵다 N 값과 일치시킵니다.

SELECT c.item_id, COUNT(*) AS cat_count 
FROM item_category AS c 
WHERE c.category_id IN (201,202) 
GROUP BY c.item_id 
HAVING cat_count = 2 

두 기술을 좋아하며, 다른 상황에서 잘 작동 :

그래서 다른 방법에 의해 GROUP을 사용하는 것입니다.

+0

감사합니다. 두 번째 쿼리가이 경우에 더 적합하고 잘 작동하는 것 같습니다. 다시 한 번 감사드립니다! – flicker

-2

당신이 시도 할 수 :

SELECT * FROM item_category WHERE category_id IN (201, 202, ...)

(또는 코멘트 말하는 것처럼 ... 당신은하지 않을 수 있습니다.)

+0

item_ids 3 및 4가 반환됩니다. – Bruce

0

이 사용 중 하나 가입, 또는 GROUP BY :

SELECT category_id, fieldhere, anotherfield 
FROM item_category 
WHERE category_id in (201,202) 
GROUP BY category_id 
HAVING count(category_id) = 2 
0

각 item_id를 가정하면 category_id는 고유합니다.

select *, count(item_id) as c from item_category 
where category_id in (201, 202) 
group by item_id 
having c = 2; 

c = 2 (대상 개수)

0

나는 지금 정확한 쿼리를 제공하는 시간을 가지고 있지만,이 같은 시도하지 않습니다

select item_category.* from 
item_category , item_category ic1, item_category ic2 where 
ic1.category_id = 201 and 
ic2.category_id = 202 and 
ic1.item_id = ic2.item_id and 
item_category.item_id = ic1.item_id and 
item_category.item_id = ic2.item_id; 

어쩌면 조건이 잘못을하지만 당신은 뭔가이 방법을 시도 할 수 있습니다.

+0

ic1.item_id = ic2.item_id가 정말로 필요한지 확실하지 않습니다. – martincho