![](/img/trans.png)
[英]How do I count all items for one table in a multiple INNER JOIN SQL?
[英]How do I JOIN a third table in my SQL statement which returns a COUNT without losing the 0 count items?
從這個問題繼續, 我需要一條SQL語句,該語句返回具有特定值的表中的行數。
我們從下面開始執行一條SQL語句...
SELECT t.teamid,
t.teamname,
COALESCE(COUNT(p.playerid), 0) AS playercount,
t.rosterspots
FROM TEAMS t
LEFT JOIN PLAYERS p ON p.teamid = t.teamid
GROUP BY t.teamid, t.teamname, t.rosterspots
我還有一個要添加的約束。 如果玩家要計入“玩家人數”,該如何通過體檢?
我將介紹桌子。
MedicalTests PlayerId PassedMedical 1 1 2 0 3 1 4 1
其中“ PassedMedical”有點(1 = true)。
並且還將1 ROW的其他數據添加到Teams表中。
TeamId Team Name 3 Toronto Rapters
這樣我就有了一個擁有0名球員的球隊。
預期的輸出變為:
Team Name PlayerCount Miami Heat 2 New York Knicks 1 Toronto Rapters 0
因為一位邁阿密熱火隊的球員尚未通過醫療檢查。
如果我加
LEFT JOIN MEDICALTESTS m ON p.PlayerId = m.PlayerId
WHERE m.PassedMedical = 1
對於上面的語句,我丟失了所有的“ 0”行?
謝謝,
賈斯汀
LEFT JOIN MEDICALTESTS m ON p.PlayerId = m.PlayerId
WHERE m.PassedMedical = 1
那是矛盾的。 您是說這是一個左聯接,因此不需要存在MEDICALTESTS記錄,但是然后說該記錄實際上必須存在並且具有1作為PassedMedical。 因此,實際上,您的左聯接成為內部聯接,並且同樣,由於必須具有MEDICALTESTS行,因此還必須具有PLAYERS行,因此也將成為內部聯接。
嘗試以下方法:
INNER JOIN MEDICALTESTS m ON p.PlayerId = m.PlayerId and m.PassedMedical = 1
不確定SQL Server如何解釋FROM foo LEFT JOIN欄INNER JOIN baz ...您希望它將其解釋為FROM foo LEFT JOIN(bar INNER JOIN baz)。 如果那不起作用,請使用子選擇; 不加入,只需添加:
WHERE p.PlayerId IS NULL or (select PassedMedical from MEDICALTESTS m where m.PlayerId=p.PlayerID) = 1
希望盡管我對SQL Server不熟悉,但對您有所幫助。
如果我誤解了這個問題,請原諒我,但我認為沒有必要將左聯接加入玩家表。 我們只需要球員人數。 為什么不這樣:
SELECT t.teamid,
t.teamname,
(SELECT COUNT(*) FROM players inner join medicaltests on players.playerid = medicaltests.playerid where players.teamid = t.teamid and medicaltests.passedmedical = 1) AS playercount,
t.rosterspots
FROM TEAMS t
GROUP BY t.teamid, t.teamname, t.rosterspots
為什么不將其作為計算列呢?
SELECT
t.teamid,
t.teamname,
(SELECT COUNT(*) FROM MEDICALTESTS m WHERE p.PlayerId = m.PlayerId and m.PassedMedical = 1 ) AS PassedMedicalCount
請閱讀以下內容以了解您遇到的問題: http : //wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN
基本上,通過將條件放在哪里,您可以將左聯接轉換為內部聯接。 嘗試以下方法:
LEFT JOIN MEDICALTESTS m ON p.PlayerId = m.PlayerId
and m.PassedMedical = 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.