Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL:relazione molti a molti con condizione AND multipla

Puoi modificare leggermente la query corrente per ottenere i risultati desiderati:

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;

Ciò restituirebbe tutti gli articoli che hanno entrambi sport e leather tag. Funziona aggregando per elemento (come stavi già facendo), ma poi affermando in un HAVING clausola che ci sono due distinti tag corrispondenti. Dal momento che abbiamo limitato solo a questi due tag in WHERE clausola, se HAVING il controllo passa dopo l'aggregazione, implica che l'elemento è una corrispondenza.