查询多对多关系 - mySQL

问题描述 投票:2回答:3

我有下表,表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。

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

php mysql sql join
3个回答
0
投票
  • 你可以在用户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 

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表。


0
投票

尝试内部连接,如:

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"
© www.soinside.com 2019 - 2024. All rights reserved.