查询多对多关系 - 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
。这会将结果聚合为特定用户的单行。 - 现在,我们可以使用
Having
和Sum()
来过滤掉案例。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 by
和having
:
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 基础 -- 多表关系(一对一1对多(多对一)多对多)多表查询(内连接外连接自连接子查询(嵌套查询)联合查询 union)笛卡儿积
Mysql连接查询匹配所有标签的多个“标签”(多对多关系)?