MYSQL множественный выбор для той же категории? - PullRequest
0 голосов
/ 14 сентября 2009

У меня есть 3 таблицы (сцены, категории, сцены / категории) в отношениях многие ко многим.

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

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

Ответы [ 2 ]

4 голосов
/ 14 сентября 2009

Вы должны требовать, чтобы в таблице «многие ко многим» существовала строка для этого идентификатора сцены, для каждой категории: Итак, попробуйте это:

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'
2 голосов
/ 14 сентября 2009

Ответ Чарльза Бретаны сработает, но, возможно, вы захотите проверить его эффективность, чтобы увидеть, какой из них лучше для вас.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...