U kunt uw huidige zoekopdracht enigszins wijzigen om de gewenste resultaten te krijgen:
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;
Dit zou alle items retourneren die zowel sport
. hebben en leather
labels. Het werkt door te aggregeren per item (zoals je al deed), maar dan te beweren in een HAVING
clausule dat er twee verschillende overeenkomende tags zijn. Omdat we ons hebben beperkt tot alleen deze twee tags in de WHERE
clausule, als de HAVING
check passeert na aggregatie, dit impliceert dat het item een match is.