查询多对多关系 - mySQL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查询多对多关系 - mySQL相关的知识,希望对你有一定的参考价值。

我有下表,表A和表B.

表A(用户)

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

表B(hobbylist)

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

我有一个桥牌桌(多对多的关系)

表C(user_hobby)

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

我想查询一个条件,我想知道哪个用户的爱好等于“绘图”(爱好2)但不是“唱歌”(爱好者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。

如何在不使用子查询的情况下实现此目的?

答案
  • 你可以在用户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 
另一答案

你可以使用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,您不需要users表。

另一答案

尝试内部连接,如:

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查询多对多关系[重复]

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

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

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

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

使用 linq/Entity Framework 查询多对多关系。代码优先