[英]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
;
使用CASE
或IF
。
由於該問題在“使用給定的用戶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
;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.