簡體   English   中英

SQL查詢基於具有多個聯接的子查詢返回是/否

[英]SQL Query to return Yes/No Based on a Subquery with Many-Many Join

我有一個包含3個表的多對多關系架構:Users,Team和Teamuser。

由於一個用戶可以在多個團隊中,一個團隊可以有多個用戶,因此teamuser是一個將users.id聯接到team.id的表。

我想執行一個查詢,詢問“使用給定的用戶ID,向我顯示teams表中的所有團隊,並計算一個稱為“ member”的字段,如果給定的用戶是該團隊的成員,則返回1,否則為0”

有沒有一種方法可以直接在MySQL中對一個查詢執行此操作?

TeamUser:

id  teamid  userid
5   1 [->]  1 [->]
1   1 [->]  2 [->]
2   2 [->]  2 [->]
6   3 [->]  1 [->]

teamid是加入Teams.id的外鍵。 userid是Users.id上的外鍵

團隊:

id  name
1   Whomping Willows
2   Chudley Cannons

用戶:

id  username    
1   fred
2   finn    
3   paul    
16  pickles

運行如下所示的操作以獲得笛卡爾積,然后將相關子選擇包裝在合並中以表示從屬關系?

從用戶u中選擇u.username,t.teamname,COALESCE((從teamusers itu中選擇1 itu其中itu.teamid = t.teamid和itu.userid = u.userid),0)從用戶u中選擇t,其中u.username ='finn “

警告,盡管這樣做不能很好地擴展,因為它會從團隊用戶中選擇外部笛卡爾積的每一行。 更多團隊==更多行來運行子選擇

在這里你怎么做

select
t.id,
t.name,
case when x.userid is not null then 1 else 0 end as `member`
from teams t
left join (
 select 
 tu.userid,
 tu.teamid
 from teamuser tu 
 left join users u on u.id = tu.userid  
 where u.id = 1 -- change the user id here which you are looking at
)x
on x.teamid = t.id

如果我正確理解您的意思,那么您想用兩列顯示結果:first = Team ,second- Member 結果集將包含所有團隊,並且成員列-給出的用戶名是團隊的成員。 然后,您可以使用以下查詢:

SELECT a.name AS team_name,
      CASE WHEN c.username = 'fred' THEN 1 ELSE 0 END AS member 
  FROM Teams AS a JOIN TeamUser AS b ON a.id = b.teamid
                  JOIN Users AS c ON b.userid = c.id;

(在MySQL而不是Oracle上進行實際測試后更新。)

你可以一起工作

set @userID = 1;

SELECT
  TeamsOuter.name
  , CASE IFNULL((SELECT Users.id FROM Users JOIN TeamUser ON Users.id = TeamUser.userID JOIN Teams ON TeamUser.teamID = Teams.id WHERE Teams.id = TeamsOuter.id AND Users.id = @userID), 0) WHEN 0 THEN 0 ELSE 1 END member
  , IF((SELECT Users.id FROM Users JOIN TeamUser ON Users.id = TeamUser.userID JOIN Teams ON TeamUser.teamID = Teams.id WHERE Teams.id = TeamsOuter.id AND Users.id = @userID) IS NULL, 0, 1) memberToo
FROM Teams TeamsOuter
;

使用CASEIF
由於該問題在“使用給定的用戶ID […]”中是明確的,因此正在查詢中使用它。

注意:檢查結果時:“ TeamUser”確實引用了一個“ teamID”為3的團隊,該團隊不存在……

如果您實際上希望將所有內容都放在一個位置:

SELECT
  UsersOuter.userName
  , TeamsOuter.name
  , IF((SELECT Users.id FROM Users JOIN TeamUser ON Users.id = TeamUser.userID JOIN Teams ON TeamUser.teamID = Teams.id WHERE Teams.id = TeamsOuter.id AND Users.id = UsersOuter.id) IS NULL, 0, 1) member
FROM Teams TeamsOuter, Users UsersOuter
ORDER BY UsersOuter.userName, TeamsOuter.name
;

SQL小提琴

暫無
暫無

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

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