2014-12-30 80 views
0

我正在嘗試使用MySQL查詢來構建用戶在Bowl Mania遊戲中的排行榜(用戶每次嘗試預測每個學院的獲勝者足球比賽,併爲每個選項分配一個分數權重)。將查詢轉換爲左連接(?)以包含不匹配的用戶ID

我有3個表:

--games 
id team1 team2 year 

--picks 
userid gameid points 

--actResults 
gameid winner 

我想建立它可以根據他們對每個成功預測遊戲「點」下注夏天每個用戶一個SELECT查詢(即5一個成功的賭注在gameid = 1時獲得5分,而不成功的預測則獲得0分)。

下面的查詢幾乎完成我想要的,但唯一的問題是它不包括具有零點的用戶(即picks.winners和actResults.winners之間沒有任何匹配的用戶)。

SELECT DISTINCT picks.userid AS Player, SUM(picks.points) AS Points 
FROM picks, games, actResults 
WHERE picks.gameid = games.id 
AND picks.winner = actResults.winner 
AND games.year = '2014' 
AND picks.userid = picks.userid 
GROUP BY picks.userid 
ORDER BY Points DESC 

期望的結果會是這個樣子

Player Points 
User1 10 
User4 9 
User3 4 
User2 0 
User5 0 
+0

查詢中的'AND picks.userid = picks.userid'部分是一個no- op,除非可能發生'picks.userid'永遠爲空,在這種情況下,查詢的部分等同於'AND picks.userid IS NOT NULL'。另外 - 除非'picks.winner' /'actResults.winner'包含比我預期更多的細節,我認爲你需要添加一些條件來限制你的'actResults'。否則,你會計算指定團隊贏得*任何*遊戲的情況,而不是他們贏得*特定*遊戲的情況。 – ruakh

回答

1

難的是完全沒有轉換到LEFT JOIN(基本上,只是涉及到改變逗號加入到常規的ANSI JOIN,然後插入關鍵字LEFT),而是修復SUM表達式以僅添加actResults.winner = picks.winner的行。這裏是做它的一種方法:

SELECT picks.userid AS Player, 
     SUM(CASE WHEN actResults.winner IS NULL 
       THEN 0 
       ELSE picks.points 
      END) AS Points 
    FROM picks 
    JOIN games 
    ON games.id = picks.gameid 
    LEFT 
    JOIN actResults 
    ON actResults.winner = picks.winner 
WHERE games.year = '2014' 
GROUP BY picks.userid 
ORDER BY Points DESC 
; 

(另一種方式是跳過LEFT JOIN完全,並使用EXISTS表達的子查詢。)


編輯補充:要添加根據評論中的要求,您可以編寫一個「可用點」字段:

SELECT picks.userid AS Player, 
     SUM(CASE WHEN actResults.winner = picks.winner 
       THEN picks.points 
       ELSE 0 
      END) AS Points, 
     SUM(CASE WHEN actResults.gameid IS NULL 
       THEN picks.points 
       ELSE 0 
      END) AS AvailablePoints 
    FROM picks 
    JOIN games 
    ON games.id = picks.gameid 
    LEFT 
    JOIN actResults 
    ON actResults.gameid = games.id 
WHERE games.year = '2014' 
GROUP BY picks.userid 
ORDER BY Points DESC 
; 
+0

精美的作品。不知道CASE關鍵字。謝謝! –

+0

@RyanMiller:不客氣! – ruakh

+0

如果我想在此查詢中添加一個額外的(計算)列,將會添加「可用點數」,該怎麼辦?它將是用戶分配給那些還沒有存在於actResults表中的遊戲點的所有點的總和(即那些遊戲尚未播放)? –

相關問題