簡體   English   中英

多對多查詢-MySQL

[英]Query in many to many relationship - mySQL

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

我想查詢一個條件,我想知道哪個用戶的愛好等於“繪畫”(愛好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"

由於上述查詢,我​​仍然得到兩個用戶。 應該只顯示用戶= David。

不使用子查詢如何實現呢?

  • 您可以根據用戶名和名稱進行Group by 這會將結果匯總到特定用戶的單行中。
  • 現在,我們可以使用Having with 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 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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM