Можете леко да промените текущата си заявка, за да получите желаните резултати:
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;
Това ще върне всички елементи, които имат и двете sport
и leather
етикети. Работи чрез агрегиране по елемент (както вече правехте), но след това заявява в HAVING
клауза, че има два различни съвпадащи тагова. Тъй като се ограничихме само до тези два маркера в WHERE
клауза, ако HAVING
проверката преминава след агрегиране, това означава, че елементът е съвпадение.