2014-11-23 99 views
0

我有三個表我的NFL數據庫MYSQL子查詢需要與LIMIT 5從父查詢

玩家返回每個結果多行 - 其中有玩家ID /名稱

stats_passing - 這有通過遊戲

玩家ID,game_id,碼達陣

遊戲 - 其中有遊戲最新

我試圖獲得前四名選手最碼達陣,在過去的五場比賽,他們已經在發揮

我有這個至今:

SELECT 
    p.name, 
    SUM(s.yds) AS tot_yds, 
    SUM(s.tds) AS tot_tds 
FROM players AS p 
INNER JOIN (
    SELECT 
     s.id, 
     s.player_id, 
     s.yds, 
     s.tds 
    FROM stats_passing AS s 
    INNER JOIN games AS g ON s.game_id = g.id 
    WHERE YEAR(g.date) = 2014 
    ORDER BY s.player_id, g.date DESC 
    LIMIT 5) AS s ON p.id = s.player_id 
ORDER BY tot_yds DESC, tot_tds DESC 
LIMIT 4 

但是它只有一個返回結果。

Drew Brees, 1497, 10 

但正如我上面所說的,我想前四名選手通過他們相似的總碼,達陣總排序,以

Drew Brees, 1497, 10 
Tom Brady, 1234, 9 
Andrew Luck, 1123, 8 
Aaron Rodgers, 1023, 7 

我一直工作在這幾天,我想我的MySQL知識就此結束。請幫忙!提前致謝!

回答

0

想通了。希望這可以幫助別人。如果效率不高,請隨時添加。

SET @rn = 0; 
SET @prev = 0; 

SELECT 
    name, 
    tot_yds, 
    tot_tds 
FROM (
    SELECT 
     p.name, 
     SUM(s.yds) AS tot_yds, 
     SUM(s.tds) AS tot_tds 
    FROM players AS p 
    INNER JOIN (
     SELECT 
      s.id, 
      s.player_id, 
      s.yds, 
      s.tds, 
      @rn := CASE WHEN @prev = s.player_id 
        THEN @rn + 1 
        ELSE 1 
        END AS rn, 
      @prev := s.player_id 
     FROM (SELECT 
       st.id, 
       st.player_id, 
       st.yds, 
       st.tds 
      FROM stats_passing AS st 
      INNER JOIN games AS g ON st.game_id = g.id 
       WHERE YEAR(g.date) = 2014 
      ORDER BY st.player_id, g.date DESC) AS s 
     ) AS s ON p.id = s.player_id 
    WHERE rn <= 5 
    GROUP BY p.name) AS ns 
ORDER BY tot_yds DESC, tot_tds DESC 
LIMIT 4