Anda dapat sedikit mengubah kueri Anda saat ini untuk mendapatkan hasil yang Anda inginkan:
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;
Ini akan mengembalikan semua item yang memiliki keduanya sport dan leather tag. Ini bekerja dengan menggabungkan berdasarkan item (seperti yang sudah Anda lakukan), tetapi kemudian menegaskan dalam HAVING klausa bahwa ada dua tag pencocokan yang berbeda. Karena kami membatasi hanya dua tag ini di WHERE klausa, jika HAVING pemeriksaan berlalu setelah agregasi, ini menyiratkan bahwa item tersebut cocok.