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.