Svůj aktuální dotaz můžete mírně upravit, abyste získali požadované výsledky:
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;
To by vrátilo všechny položky, které mají obě sport
a leather
značky. Funguje to tak, že se agreguje podle položek (jak jste to již dělali), ale pak se potvrdí v HAVING
klauzule, že existují dva odlišné odpovídající značky. Protože jsme se omezili pouze na tyto dvě značky v WHERE
klauzule, pokud je HAVING
kontrola projde po agregaci, znamená to, že položka je shodná.