2009-09-14 3 views
0

다 대다 관계에서 세 개의 테이블 (장면, 범주, 장면 _ 범주)이 있습니다.MYSQL 복수 선택 동일한 카테고리?

장면 (ID, 제목, 설명) 카테고리 (ID, 제목) scenes_categories (scene_id, CATEGORY_ID)

나는 여러 범주와 일치해야 장면을 선택하는 쿼리를 만드는 데 문제가 있습니다. 예를 들어, 카테고리 3과 카테고리 5 및 카테고리 8과 일치하는 장면을 선택하려고 할 수 있지만이를 작동시키는 방법을 알 수는 없습니다.

지금까지 내가

SELECT scenes.id, scenes.title, scenes.description 
FROM scenes 
LEFT JOIN scenes_categories ON scenes.id = scenes_categories.scene_id 
LEFT JOIN categories ON scenes_categories.category_id = categories.id 
WHERE scenes_categories.category_id = '3' 
AND scenes_categories.category_id = '5' 
AND scenes_categories.category_id = '8' 
AND scenes.id = '1' 

같은 내가 일치해야 기록을 위해 선택할 수있는 방법은 모든 카테고리 ID의 지정있어?

답변

4

는 각 당신이 필요로하는 카테고리 ID, 행이 그 sceneId 대한 대다 테이블에 존재해야 할 필요가 : 그래서이 시도 :

SELECT s.id, s.title, s.description 
FROM scenes s 
WHERE s.id = '1' 
    And Exists (Select * From scenes_categories 
       Where scene_id = s.Id 
        And category_id = '3') 
    And Exists (Select * From scenes_categories 
       Where scene_id = s.Id 
        And category_id = '5') 

    And Exists (Select * From scenes_categories 
       Where scene_id = s.Id 
        And category_id = '8') 

이다 작동해야 다른 옵션 셋을 내부 대신 조인

SELECT s.id, s.title, s.description 
FROM scenes s 
    Join scenes_categories c3 
     On c3.scene_id = s.Id 
      And c3.category_id ='3' 
    Join scenes_categories c5 
     On c5.scene_id = s.Id 
      And c5.category_id ='5' 
    Join scenes_categories c8 
     On c8.scene_id = s.Id 
      And c8.category_id ='8'  
WHERE s.id = '1' 
+0

그는 동적 솔루션을 찾고있었습니다. – Zoidberg

+0

미안 해요, 내 downvote을 벗었 ... 그가 OR 관계를 원하지 않았다는 것을 몰랐어요 – Zoidberg

+0

제 2의 모습을 위해 @zoid, np, thx! –

2

찰스 Bretana의 대답은 작동하지만 당신을 위해 잘 작동하는 볼이에 대해 그 성능을 확인 할 수 있습니다.

SELECT * FROM scenes 
INNER JOIN (
    SELECT scene_id 
    FROM scenes_categories 
    WHERE category_id IN (3,5,8) 
    GROUP BY scene_id 
    HAVING count(*) = 3 
) valid ON scenes.id = valid.scene_id 

SQL이 동적이라고 가정하면 구현하기가 더 쉬울 것입니다.