Vous pouvez modifier légèrement votre requête actuelle pour obtenir les résultats souhaités :
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;
Cela renverrait tous les éléments qui ont à la fois sport
et leather
Mots clés. Cela fonctionne en agrégeant par élément (comme vous le faisiez déjà), mais en affirmant ensuite dans un HAVING
clause qu'il existe deux balises correspondantes distinctes. Puisque nous nous sommes limités à ces deux balises uniquement dans le WHERE
clause, si la HAVING
la vérification réussit après l'agrégation, cela implique que l'élément est une correspondance.