MySQL-запрос, пересечение отношений «многие ко многим»

0

Есть ли у кого-то хорошая идея/решение, как достичь этого?

Ситуация такова: У меня есть таблицы "релизы" и "ntags", связанные с 'release_ntags' (содержащие 'release_id' и 'ntag_id')

И я хотел бы получить результаты для релизов через ntag 'slug'.

Мне удалось получить эту полурабочую работу:

SQL

SELECT r.id, r.name
FROM releases r
LEFT JOIN ntags_releases rt ON rt.release_id = r.id
JOIN ntags nt ON nt.id = rt.ntag_id
AND (nt.name = ('TAG_1') OR nt.name = ('TAG_2'))
GROUP BY r.id, r.name

До сих пор так хорошо, но это дает мне все релизы с "TAG_1" PLUS все выпуски с "TAG_2" (и, конечно же, те, у которых оба тега).

Но мне нужно только получить пересечение тегов, скажем:

"выпускается с 'TAG_1' И 'TAG_2'"

Итак, я попробовал:

...
AND (nt.name = ('TAG_1') AND nt.name = ('TAG_2'))
... 

Но это приводит к пустующему результату. У кого-нибудь есть идея, как этого достичь? Не знаю, как продвигаться дальше и действительно оценил бы какой-то вклад!

ТНХ

Теги:
many-to-many
join
intersection

1 ответ

1
Лучший ответ

Вы можете потребовать, чтобы в предложении having присутствовали два разных ntags:

SELECT  r.id, r.name
FROM    releases r
JOIN    ntags_releases rt
ON      rt.release_id = r.id
JOIN    ntags nt
ON      nt.id = rt.ntag_id
WHERE   nt.name in ('TAG_1', 'TAG_2')
GROUP BY
        r.id, r.name
HAVING
        COUNT(distinct nt.name) = 2
  • 0
    Ах, спасибо! Хорошая идея! Пока работает отлично :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню