MySql查询多对多关系

时间:2009-07-29 20:54:52

标签: mysql many-to-many

一个让我困惑的n:m关系的一个非常简单的例子。假设我们有两个表“Plant”和“Attribute”,另一个表与他们的ID保持关系:

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

因此,工厂1具有属性1,2和3.工厂2具有属性1和2,工厂3具有属性2和3。 现在,在一个查询中,我如何获得例如所有具有属性2和3的植物? 结果应返回P1和P3,因为它们都具有属性2和3。 我正在尝试结合,但这也会给我P2作为结果......任何想法?

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

此查询结构避免了对distinct子句的需要(假设解析表中没有重复记录)。

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;

答案 2 :(得分:0)

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