【问题标题】:MySql query over many-to-many relationship [duplicate]MySql查询多对多关系[重复]
【发布时间】:2009-07-29 20:54:52
【问题描述】:

一个非常简单的 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……有什么想法吗?

【问题讨论】:

标签: mysql many-to-many


【解决方案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】:
    select * from Plants p where 2 = ( 
      select count(*) from HasPlants h
         where h.pid = p.id and h.aid in ( a2, a3 ) 
      )
    

    【讨论】:

    • IN 子句等价于 OR - 你会得到一个有 'a2' 或 'a3' 的计数,而不是两者。
    • @rexem:一个 pid 最多可以有一个 a2 和一个 a3。计数为 2 表示两者都有。
    猜你喜欢
    • 2019-12-09
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多