Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL:relacionamento muitos para muitos com condição AND múltipla


Você pode alterar ligeiramente sua consulta atual para obter os resultados desejados:
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;

Isso retornaria todos os itens que possuem sport e leather Tag. Ele funciona agregando por item (como você já estava fazendo), mas depois afirmando em um HAVING cláusula de que existem duas tags correspondentes distintas. Como restringimos apenas essas duas tags no WHERE cláusula, se o HAVING verificação passa após a agregação, isso implica que o item é uma correspondência.