2009-09-14 5 views
0

У меня есть 3 таблицы (сцены, категории, scenes_categories) во многих отношениях.MYSQL Multiple Select для той же категории?

сцены (идентификатор, название, описание) категории (идентификатор, название) 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' 

Как я могу выбрать записи, которые должны соответствовать указаны всем категориям идентификаторы?

ответ

4

Вы должны требовать, чтобы строка существует в многие ко многим таблицы для этого sceneId, для каждого CategoryId вы требуют: Так попробуйте это:

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

Извините, я снял свой нижний план ... не понимал, что он не хочет отношения OR – Zoidberg

+0

@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 динамический, это, вероятно, будет немного проще реализовать.

Смежные вопросы