Pomocí IN:
SELECT p.*
FROM POSTS p
WHERE p.id IN (SELECT tg.post_id
FROM TAGGINGS tg
JOIN TAGS t ON t.id = tg.tag_id
WHERE t.name IN ('Cheese','Wine','Paris','Frace','City','Scenic','Art')
GROUP BY tg.post_id
HAVING COUNT(DISTINCT t.name) = 7)
Použití JOIN
SELECT p.*
FROM POSTS p
JOIN (SELECT tg.post_id
FROM TAGGINGS tg
JOIN TAGS t ON t.id = tg.tag_id
WHERE t.name IN ('Cheese','Wine','Paris','Frace','City','Scenic','Art')
GROUP BY tg.post_id
HAVING COUNT(DISTINCT t.name) = 7) x ON x.post_id = p.id
Pomocí EXISTS
SELECT p.*
FROM POSTS p
WHERE EXISTS (SELECT NULL
FROM TAGGINGS tg
JOIN TAGS t ON t.id = tg.tag_id
WHERE t.name IN ('Cheese','Wine','Paris','Frace','City','Scenic','Art')
AND tg.post_id = p.id
GROUP BY tg.post_id
HAVING COUNT(DISTINCT t.name) = 7)
Vysvětlení
Jádrem věci je, že COUNT(DISTINCT t.name)
musí odpovídat počtu názvů štítků, aby bylo zajištěno, že všechny tyto štítky souvisejí s příspěvkem. Bez DISTINCT existuje riziko, že duplikáty jednoho ze jmen mohou vrátit počet 7 – takže byste měli falešně pozitivní výsledek.
Výkon
Většina vám řekne, že JOIN je optimální, ale JOINy také riskují duplikaci řádků v sadě výsledků. EXISTS by byla moje další volba – žádné duplicitní riziko a obecně rychlejší provádění, ale kontrola plánu vysvětlení vám nakonec řekne, co je nejlepší na základě vašeho nastavení a dat.