2011-05-16 132 views
2

我無法從主表中獲取的行數從兩個不同條件的特定錶行計數行:Mysql的加入另一個表

主要是,我有一個表的球員,用簡單的信息,如playername和id。 我也有一個表格,其中每個球員列出了動作類型(目標或助攻)。我想讓所有的球員都有一個專欄來計算他們的目標,另一名球員正在計算他們的助攻數。當然,我想要那些沒有進球或沒有任何助攻的懶惰球員。

現在我想出了這個要求,但它只給我最好的球員,而我想要所有的球員。請照亮我的腦海裏;)

SELECT 
    `p`.`playername`, 
    COUNT(`a1`.`actionid`) AS `goals`, 
    COUNT(`a2`.`actionid`) AS `assists` 

FROM `Player` AS `p` 

LEFT JOIN `Actions` AS `a1` 
ON `a1`.`id` = `p`.`id` 

LEFT JOIN `Actions` AS `a2` 
ON `a2`.`id` = `p`.`id` 

WHERE `a1`.`type` = 'goal' 
    AND `a2`.`type` = 'assist' 

GROUP BY 
    `a1`.`userId`, 
    `a2`.`userId` 

LIMIT 0 , 30 
+1

我想你可能需要調整示例SQL ..這似乎不正確。兩個表都有相同的參考('a'),並且有一個'r2'和'a2'似乎不會與任何東西相關聯。 – roberttdev 2011-05-16 12:55:00

+0

你說得對,我留下了一些錯誤,應該會更好? – 2011-05-16 12:56:56

回答

3

我在你的查詢,你在它引用別名爲u其中你沒有分配任何表的表的條件加入您actions表關注。所以,我認爲你的查詢可能會引發MySQL錯誤。此外,在您的加入條件中,您引用Actions表的id字段,我希望在正常約定下,該字段是主自動遞增鍵。您可能會將其用作玩家ID,我不確定,但要更詳細地將其更改爲player_id,以便您和其他人知道下面的查詢中究竟發生了什麼。假設你編輯你的查詢在SO編輯器中「易於閱讀」,並且沒有對它進行測試,我把它調整到我認爲更準確的地步。

在select上連接表並運行COUNT時,只能計算返回的總行數。您不能COUNT根據JOIN中單個表返回的行數。如果您絕對必須使用COUNT,則必須運行多個查詢(每個COUNT需要運行1個查詢),或者針對您要查找的特定情況使用運行COUNT的子查詢。

該查詢可以作爲單個查詢運行,但COUNT不是解決方案。您使用CASESUM的組合。我們運行一個CASE..WHEN子句,測試每一行以查看已加入的操作是目標還是輔助操作。如果這是一個目標,我們給goals列的值爲1,如果它是一個輔助,我們給assists列的值爲1.然後我們運行一個聚合函數(SUM)將goalsassists的所有1加起來,和GROUP BY玩家ID。這給你一個單獨的行,用進球和助攻總數#每個球員,他們甚至贏得了球員們掙得0

SELECT 
    p.payername, 
    SUM(CASE a.type WHEN 'goal' THEN 1 ELSE 0 END) goals, 
    SUM(CASE a.type WHEN 'assist' THEN 1 ELSE 0 END) assists 
FROM Player p 
LEFT JOIN Actions a ON a.player_id = p.id 
GROUP BY p.id 
LIMIT 0, 30 

我希望幫助你出來,對你有意義。如果您仍然感到困惑,可以查看CASE的文檔以獲得更多信息。

相關問題