2009-07-29 8 views
2

Un exemple très simple d'une relation n: m qui me laisse perplexe. Supposons que nous avons deux tables « plantes » et « attribut » et une autre table entre les tenant leur relation avec leurs ID:Requête MySql sur une relation plusieurs-à-plusieurs

Plant--------hasAttribute--------Attribute 
       P1 | A1 
       P1 | A2 
       P1 | A3 
       P2 | A1 
       P2 | A2 
       P3 | A2 
       P3 | A3 

Ainsi, l'usine 1 a des attributs 1,2 et 3. Plant 2 a des attributs 1 et 2 et Plant 3 ont les attributs 2 et 3. Maintenant, en une seule requête, comment puis-je obtenir par exemple toutes les plantes qui ont l'attribut 2 et 3? Le résultat devrait retourner P1 et P3 parce qu'ils ont tous les deux les attributs 2 et 3. J'essayais l'union mais cela me donnerait P2 aussi ... des idées?

+0

Alors est-ce la http://stackoverflow.com/questions/1202668/problem-with-sql-query ici la SEULE solution? Je dois faire un compte distinct? Il n'y a pas d'autre moyen? – cssmaniac

Répondre

0
select * from Plants p where 2 = ( 
    select count(*) from HasPlants h 
    where h.pid = p.id and h.aid in (a2, a3) 
) 
+0

La clause IN est l'équivalent de OR - vous obtiendrez un nombre de ceux avec 'a2' ou 'a3', pas les deux. –

+0

@rexem: il peut y avoir au plus un a2 et au plus un a3 pour un pid. Un nombre de 2 signifie qu'il a les deux. – palindrom

1

Cette structure de requête évite la nécessité d'une clause distincte (à condition qu'il n'y ait pas d'enregistrements en double dans la table de résolution).

SELECT p.PlantID 
FROM 
    Plant p INNER JOIN PlantAttribute pa 
    ON p.PlantID = pa.PlantID AND pa.AttributeID = 1 
    INNER JOIN PlantAttribute pa2 
    ON p.PlantID = pa2.PlantID AND pa2.AttributeID = 2;