Menggunakan DI:
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)
Menggunakan GABUNG
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
Menggunakan 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)
Penjelasan
Intinya adalah bahwa COUNT(DISTINCT t.name)
harus cocok dengan jumlah nama tag untuk memastikan bahwa semua tag tersebut terkait dengan postingan. Tanpa DISTINCT, ada risiko duplikat salah satu nama dapat menghasilkan 7 hitungan--sehingga Anda mendapatkan hasil positif palsu.
Kinerja
Sebagian besar akan memberi tahu Anda bahwa GABUNG itu optimal, tetapi GABUNG juga berisiko menduplikasi baris di hasil. EXISTS akan menjadi pilihan saya berikutnya--tidak ada risiko duplikat, dan umumnya eksekusi lebih cepat, tetapi memeriksa rencana penjelasan pada akhirnya akan memberi tahu Anda apa yang terbaik berdasarkan penyiapan dan data Anda.