Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL :relation plusieurs à plusieurs avec plusieurs conditions ET

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.