MySql查询多对多关系[重复]
Posted
技术标签:
【中文标题】MySql查询多对多关系[重复]【英文标题】:MySql query over many-to-many relationship [duplicate] 【发布时间】: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……有什么想法吗?
【问题讨论】:
那么***.com/questions/1202668/problem-with-sql-query 是这里唯一的解决方案吗?我必须做一个不同的计数?没有别的办法吗? 【参考方案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 表示两者都有。以上是关于MySql查询多对多关系[重复]的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 基础 -- 多表关系(一对一1对多(多对一)多对多)多表查询(内连接外连接自连接子查询(嵌套查询)联合查询 union)笛卡儿积
Mysql连接查询匹配所有标签的多个“标签”(多对多关系)?