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)
जॉइन का उपयोग करना
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 का उपयोग करना
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)
स्पष्टीकरण
चीजों की जड़ यह है कि COUNT(DISTINCT t.name)
यह सुनिश्चित करने के लिए टैग नामों की संख्या से मेल खाना चाहिए कि वे सभी टैग पोस्ट से संबंधित हैं। DISTINCT के बिना, एक जोखिम है कि नामों में से किसी एक के डुप्लीकेट 7 की गिनती लौटा सकते हैं--इसलिए आपके पास एक गलत सकारात्मक होगा।
प्रदर्शन
अधिकांश आपको बताएंगे कि जॉइन इष्टतम है, लेकिन जॉइन परिणामसेट में पंक्तियों को डुप्लिकेट करने का भी जोखिम उठाते हैं। EXISTS मेरी अगली पसंद होगी--कोई डुप्लिकेट जोखिम नहीं, और आम तौर पर तेज़ निष्पादन लेकिन व्याख्या योजना की जांच अंततः आपको बताएगी कि आपके सेटअप और डेटा के आधार पर सबसे अच्छा क्या है।