多对多关系中的查询 - mySQL

Posted

技术标签:

【中文标题】多对多关系中的查询 - mySQL【英文标题】:Query in many to many relationship - mySQL 【发布时间】:2018-10-18 18:13:15 【问题描述】:

我有以下表,表A和表B

表 A(用户)

userid    name
--------------------
1         Sam
2         David

表 B(业余爱好者)

hobbyid   hobby
--------------------
1         singing
2         drawing

我有一个桥接表(多对多关系)

表 C (user_hobby)

userid    hobbyid
--------------------
1         1
2         2
1         2

我想查询一个条件,我想知道哪个用户的爱好等于“绘画”(爱好 ID 2)但不是“唱歌”(爱好 ID 1)。 如何在没有子查询的情况下实现这一目标

我尝试了以下查询

SELECT * 
FROM hobbylist 
     JOIN user_hobby AS uh 
       ON hobbylist.hobbyid = uh.hobbyid
     JOIN users AS us 
       ON us.userid = uh.userid
WHERE hobby = "drawing" 
  AND hobby <> "singing"

由于上述查询,我​​仍然获得了两个用户。它应该只显示 user = David。

如何在不使用子查询的情况下实现这一目标

【问题讨论】:

【参考方案1】: 您可以在用户 ID 和名称上Group by。这会将结果汇总到特定用户的单行中。 现在,我们可以使用HavingSum() 来过滤掉案例。 Sum(hobby = 'drawing') 对以绘画为爱好的用户来说是积极的。 Sum(hobby = 'singing') 对于根本没有唱歌作为爱好的用户将为零。

尝试以下方法:

SELECT us.userid,
       us.name
FROM   hobbylist
       JOIN user_hobby AS uh
         ON hobbylist.hobbyid = uh.hobbyid
       JOIN users AS us
         ON us.userid = uh.userid
GROUP  BY us.userid,
          us.name
HAVING Sum(hobby = 'drawing')
       AND Sum(hobby = 'singing') = 0 

【讨论】:

【参考方案2】:

您可以使用group byhaving

select uh.userid
from user_hobby uh join
     hobby h
     on h.hobbyid = uh.hobbyid
where h.hobby in ('drawing', 'singing')
group by uh.userid
having min(h.hobby) = max(h.hobby) and min(h.hobby) = 'drawing';

请注意,要获取userid,您不需要用户表。

【讨论】:

【参考方案3】:

尝试像这样的内部连接:

select * from hobbylist, user_hobby, users where users.userid = user_hobby.userid and hobbylist.hobbyid = user_hobby.hobbyid and hobbylist.hobby = "drawing" and hobbylist.hobby <> "singing"

【讨论】:

以上是关于多对多关系中的查询 - mySQL的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 基础 -- 多表关系(一对一1对多(多对一)多对多)多表查询(内连接外连接自连接子查询(嵌套查询)联合查询 union)笛卡儿积

MySql查询多对多关系[重复]

MySQL选择多对多的位置

Mysql连接查询匹配所有标签的多个“标签”(多对多关系)?

在 MySQL 中,对于连接谓词之间具有多对多关系的大型表,最有效的查询设计是啥?

Mysql数据库多对多关系未建新表