IN gebruiken:
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)
Een JOIN gebruiken
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
EXISTS gebruiken
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)
Uitleg
De crux is dat de COUNT(DISTINCT t.name)
moet overeenkomen met het aantal tagnamen om ervoor te zorgen dat al die tags gerelateerd zijn aan het bericht. Zonder de DISTINCT bestaat het risico dat duplicaten van een van de namen een telling van 7 kunnen opleveren, zodat u een vals positief resultaat krijgt.
Prestaties
De meesten zullen je vertellen dat de JOIN optimaal is, maar JOIN's lopen ook het risico dat rijen in de resultatenset worden gedupliceerd. BESTAAT zou mijn volgende keuze zijn - geen dubbel risico, en over het algemeen snellere uitvoering, maar het controleren van het uitlegplan zal u uiteindelijk vertellen wat het beste is op basis van uw instellingen en gegevens.