MySQL-запрос, пересечение отношений «многие ко многим» - PullRequest
0 голосов
/ 07 октября 2010

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

Ситуация такова: у меня есть таблицы 'Releases' и 'Ntags', связанные с помощью 'Release_Ntags' (содержащие 'release_id' и 'ntag_id')

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

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

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' AND 'TAG_2'"

Итак, я попытался:

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

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

thx

1 Ответ

1 голос
/ 07 октября 2010

Вы можете требовать, чтобы в предложении 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
...