2009-07-20 78 views
0

我在表上命名爲players,然後其他表名爲triesconversions,penalties, dropgoals。在conversions MySQL - 需要幫助計數id與其他表中的某些值相對應

  • 數量的處罰爲player_idtries
  • 數轉換爲player_id

    • 嘗試次數爲player_id的:

      我需要從playersplayer_id,再算上以下penalties

    • 下降目標數player_id in dropgoals

    而這一切都需要一次性完成,因爲每場比賽都有大約15名球員,該網站涉及橄欖球。

    我曾嘗試以下,其工作原理:

    SELECT players.player_id, players.number, CASE WHEN (COUNT(tries.player_id) = 0) THEN ' ' ELSE COUNT(tries.player_id) END AS nrTries FROM players LEFT JOIN tries ON players.player_id = tries.player_id WHERE players.team_id IS NULL GROUP BY players.player_id ORDER BY players.number

    它選擇從players表中的所有玩家,並計算他們的嘗試,但只要我把它更改爲以下它給了我一個錯誤:

    SELECT players.player_id, players.number, player.name, CASE WHEN (COUNT(tries.player_id) = 0) THEN ' ' ELSE COUNT(tries.player_id) END AS nrTries FROM players, player LEFT JOIN tries ON players.player_id = tries.player_id WHERE players.player_id = player.player_id AND players.team_id IS NULL GROUP BY players.player_id ORDER BY players.number

    它提供了以下錯誤:

    Unknown column 'players.player_id' in 'on clause'

    有人可以幫我這個,我一直在掙扎幾天嗎?

    在此先感謝

    //編輯:

    嗨,好,我現在感覺非常愚蠢,此代碼的工作出色,除了當一個球員在多於一個類型已經打進了,說嘗試和轉換,或嘗試和處罰,它錯誤地計數每種類型的數量,並且它們都是一樣的。假設我的球員獲得了1罰則和3個dropgoals,輸出爲3罰分和3個dropgoals,我無法弄清楚什麼是錯誤的。

    這裏是我的查詢:

    SELECT players.player_id, players.number, player.name, player.surname, 
    CASE WHEN (COUNT(tries.player_id) = 0) THEN '& nbsp;' ELSE COUNT(tries.player_id) END AS nrTries, 
    CASE WHEN (COUNT(conversions.player_id) = 0) THEN '& nbsp;' ELSE COUNT(conversions.player_id) END AS nrConversions, 
    CASE WHEN (COUNT(dropgoals.player_id) = 0) THEN '& nbsp;' ELSE COUNT(dropgoals.player_id) END AS nrDropgoals, 
    CASE WHEN (COUNT(penalties.player_id) = 0) THEN '& nbsp;' ELSE COUNT(penalties.player_id) END AS nrPenalties 
    FROM players 
    LEFT JOIN tries ON players.player_id = tries.player_id AND tries.game_id = '$game_id' 
    LEFT JOIN conversions ON players.player_id = conversions.player_id AND conversions.game_id = '$game_id' 
    LEFT JOIN dropgoals ON players.player_id = dropgoals.player_id AND dropgoals.game_id = '$game_id' 
    LEFT JOIN penalties ON players.player_id = penalties.player_id AND penalties.game_id = '$game_id' 
    LEFT JOIN player ON players.player_id = player.player_id 
    WHERE players.player_id = player.player_id AND players.team_id IS NULL AND players.game_id = '$game_id' 
    GROUP BY players.player_id ORDER BY players.number 
    

    請注意: $ game_id是一個PHP變量。
    另外:我在&和nbsp;否則它不會被輸出到SO。

    有人能請我指出正確的方向嗎?

  • +0

    爲什麼你不遵循以前的建議? – hobodave 2009-07-21 16:08:47

    +0

    我的第三個回答不包括這個嗎?你能否澄清你的數據和錯誤,因爲我不瞭解你的進一步編輯。 – cletus 2009-07-22 10:40:58

    回答

    1

    我有點困惑,爲什麼你說Cletus有正確的解決方案,並且在更新原始問題時不使用它。也就是說,Cletus的解決方案稍微關閉,你需要COUNT()而不是SUM()。請嘗試以下操作:

    SELECT players.player_id, 
    (SELECT COUNT(*) FROM tries WHERE player_id = players.player_id) tries, 
    (SELECT COUNT(*) FROM penalties WHERE player_id = players.player_id) penalties 
    FROM players; 
    

    這將返回0的,而不是& NBSP的我建議你處理,在應用程序代碼,但。如果你真的想要從mysql獲取,你可以在CASE亂七八糟的地方添加。

    0

    爲什麼第二個查詢引用「player」?我沒有看到你在其他地方提過這樣的桌子......(「從玩家,玩家」)只要確保這是故意的。

    爲了保持結構的一致性,避免混合使用隱式連接(例如「FROM players,player」)的顯式連接(例如「LEFT JOIN」)可能會有所幫助。

    +0

    我需要`player`表中的播放器名稱,我在`CASE`語句之前引用它。 – 2009-07-20 15:03:08

    3

    您還沒有有關數據不夠具體,但是,假設有在每個玩家每個相關表中的一個記錄和你快樂顯示NULL,如果它不存在,那麼:

    SELECT player_id, tries, conversions, penalties, dropgoals 
    FROM players p 
    LEFT JOIN tries t ON t.player_id = p.player_id 
    LEFT JOIN conversions c ON c.player_id = p.player_id 
    LEFT JOIN penalties e ON e.player_id = p.player_id 
    LEFT JOIN dropgoals d ON d.player_id = p.player_id 
    

    這可以重申爲:

    SELECT player_id 
    (SELECT tries FROM tries WHERE player_id = p.player_id) tries, 
    (SELECT conversions FROM conversions WHERE player_id = p.player_id) conversions, 
    (SELECT penalties FROM penalties WHERE player_id = p.player_id) penalties, 
    (SELECT dropgoals FROM dropgoals WHERE player_id = p.player_id) dropgoals 
    FROM players p 
    

    性能可能會也可能不會因您的數據庫引擎而異。如果您需要總結這則改爲:

    SELECT player_id 
    (SELECT SUM(tries) FROM tries WHERE player_id = p.player_id) tries, 
    (SELECT SUM(conversions) FROM conversions WHERE player_id = p.player_id) conversions, 
    (SELECT SUM(penalties) FROM penalties WHERE player_id = p.player_id) penalties, 
    (SELECT SUM(dropgoals) FROM dropgoals WHERE player_id = p.player_id) dropgoals 
    FROM players p 
    

    上述任何可以使用IFNULL()或類似的功能,返回0,而不是NULL,如果需要的話。

    +0

    謝謝Cletus,我只嘗試了多個左連接,並且它工作正常!剛剛檢查了任何新的答案,並看到你也有解決方案,謝謝你的麻煩,你真的是最好的。 – 2009-07-20 15:09:52