Możesz nieznacznie zmienić bieżące zapytanie, aby uzyskać żądane wyniki:
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;
Spowoduje to zwrócenie wszystkich elementów, które mają zarówno sport
i leather
Tagi. Działa poprzez agregację według pozycji (tak jak już to robiłeś), ale następnie potwierdzanie w HAVING
klauzula, że istnieją dwa różne pasujące znaczniki. Ponieważ ograniczyliśmy się tylko do tych dwóch tagów w WHERE
klauzula, jeśli HAVING
sprawdzenie przechodzi po agregacji, oznacza to, że element jest zgodny.