Puede modificar ligeramente su consulta actual para obtener los resultados que desea:
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;
Esto devolvería todos los artículos que tienen tanto sport
y leather
etiquetas Funciona agregando por elemento (como ya lo estaba haciendo), pero luego afirmando en un HAVING
cláusula de que hay dos etiquetas coincidentes distintas. Dado que restringimos solo estas dos etiquetas en WHERE
cláusula, si HAVING
la verificación pasa después de la agregación, implica que el elemento es una coincidencia.