वांछित परिणाम प्राप्त करने के लिए आप अपनी वर्तमान क्वेरी को थोड़ा बदल सकते हैं:
SELECT i.id, i.name -- OK to select name assuming id is the PK
FROM item i
LEFT JOIN relation r
ON i.id = r.item_id
LEFT JOIN tag t
ON t.id = r.tag_id
WHERE t.tag IN ('sport', 'leather')
GROUP BY i.id
HAVING COUNT(DISTINCT t.tag) = 2;
यह उन सभी वस्तुओं को वापस कर देगा जिनमें sport
दोनों हैं और leather
टैग। यह आइटम द्वारा एकत्र करके काम करता है (जैसा कि आप पहले से कर रहे थे), लेकिन फिर HAVING
में जोर देकर काम करता है क्लॉज कि दो अलग-अलग मेल खाने वाले टैग हैं। चूंकि हमने WHERE
. में केवल इन दो टैग्स तक ही सीमित रखा है खंड, यदि HAVING
एकत्रीकरण के बाद चेक पास हो जाता है, इसका मतलब है कि आइटम एक मैच है।