Brug af 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)
Brug af en 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
Brug af 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)
Forklaring
Tingenes kerne er, at COUNT(DISTINCT t.name)
skal matche antallet af tagnavne for at sikre, at alle disse tags er relateret til indlægget. Uden DISTINCT er der en risiko for, at dubletter af et af navnene kan returnere et antal på 7 - så du vil have en falsk positiv.
Ydeevne
De fleste vil fortælle dig, at JOIN er optimal, men JOIN'er risikerer også at duplikere rækker i resultatsættet. EKSISTERER ville være mit næste valg - ingen dobbeltrisiko og generelt hurtigere eksekvering, men at tjekke forklaringsplanen vil i sidste ende fortælle dig, hvad der er bedst baseret på din opsætning og dine data.