2012-03-27 2 views
0

에 속하는 모든 어린이 제가 세 MySQL의 테이블MySQL은 조인 - 모든 부모

items 
=========== 
id title 

items_in_categories 
============================ 
id item_id category_id 

categories 
=========== 
id title 

내가 에 언급 된 범주를 모두 속하는 모든 항목을 찾으려면이를 찾는 방법. 아니 어떤 하나 개의 범주하지만 모든 카테고리

예, 나는 카테고리 ID 3에 속하는 모든 항목을 검색 할 경우 5

노. 검색 할 수있는 카테고리의 수는 최대 20 개까지 올 수 있습니다.

예를 들어 카테고리 ID 1, 2, 3, 4, 5, 6, ...에 속한 모든 항목을 가져 오려고합니다. 20

나는 가능한 한 간단한 방법으로 사용하고 싶습니다.

MySQL 매뉴얼에 언급 된대로 AND와 중첩 NOT EXISTS를 시도했습니다.

아무 것도 효과가 없습니다.

업데이트 : 나는 이것을 생각해 냈습니다.

select * from 
    (select count(*) as counter, item_id from items_in_categories 
     where category_id in (3, 5) group by item_id)getall 
where counter = 2 

더 좋은 방법이 있습니까?

SELECT i.* 
FROM items i 
WHERE i.id IN (SELECT item_id from items_in_categories where category_id IN (3,5)) 
+0

거기에 더 좋은 방법이 있습니까? –

+0

나쁘지는 않지만 1.) 코멘트는 코멘트입니다. 대답은 대답입니다 :) 2.) 당신은 뚜렷한 계산을해야합니다. 그렇지 않으면 3의 일치 항목이 여러 개 있으면 실패하지만 5의 –

+0

은 표시되지 않습니다. 그래서 나는 네 자신뿐만 아니라 다른 사람들처럼 대답으로 내 대답을 주어야 했습니까? –

답변

1

나는 이것을 하나의 질의에 넣을 수 있음을 알고있다. (별도의 질의 대신에 카테고리 수를 중첩시킬 수있다. 나는 더 읽기 쉽다고 생각한다.)하지만 여기에 내 발사가있다. 이 :이 선택 GETALL 곳 ((3, 5) ITEM_ID 의해 그룹에서 CATEGORY_ID가 선택한 개수 (*) 카운터로서 items_in_categories에서 ITEM_ID 임) 카운터 = 2 의 출처 * 해낸

DECLARE @CategoryCount INT; 

SELECT @CategoryCount = COUNT(DISTINCT id) AS CategoryCount 
FROM categories 
WHERE category_id IN (3,5); 

SELECT * 
FROM items 
WHERE item_id IN 
(
    SELECT item_id 
    FROM items_in_categories 
    WHERE items_in_categories.category_id IN (3,5) 
    GROUP BY item_id 
    HAVING COUNT(DISTINCT category_id) = @CategoryCount 
) 
+0

가 내 첫번째 시도와 비슷한 대답입니까? –

+0

@kimsia 예, 유일한 차이점은 DISTINCT 개수를 사용하여 3이 2 행으로 작동하지 않는다는 것입니다.DISTINCT는 3과 5가 일치하는 경우에만 결과를 반환합니다 (동일한 범주의 중복을 무시합니다). –

+0

이 대답을 수락합니다. 나는 더 나은 해결책을 기다릴 시간이별로 없다. 바라기를 바랍니다 (나는 너무 희망적이지 않습니다), 그 대답은 더 높은 upvoted옵니다. 감사합니다 저스틴 :) –

0

는이 같은 "IN"절을 사용하는 것이 수행 할 수 있습니다.

+0

이것은 3이 있지만 5가 아닌 일치를 가져옵니다 (반대의 경우도 마찬가지입니다). OP는 3과 5가 모두있는 경우에만 결과가 필요합니다. –

+0

category_id가 아닙니다. IN (3,5) 3과 5 모두 결과를 제공합니까? –

+0

@ JustinPihony가 옳습니다. IN 절은 최소한 하나의 범주가있는 경우 일치를 제공합니다. Not ALL –

-1
select * from items i , items_in_categories iic, categories c where i.id = iic.item_id and iic.category_id = c.id and c.id in(select * from category where id in(3,5)) 

당신이 쿼리 위에서 별개의 항목을 받고 있지 않은 경우, 당신은 항목의 ID에 DISTINCT 추가 할 수 있습니다

+0

이것은 3 또는 5가있는 경기를 얻게됩니다. OP는 3 및 5를 원합니다. –

관련 문제