2014-02-12 54 views
0

我有一張桌子,我每天記錄用戶的多個分數。我試圖創建一個查詢,我得到每週不同的前5名每週贏家...來自每週的前5條記錄

難道我需要在最大分數和日期星期內對分組結果進行分組查詢嗎?或者我需要做兩個子查詢一個日期另一個最大分數然後使用外部查詢來分組?

好表的結構將是:

NAME, 
SCORE, 
DATE 

我想出了這個

SELECT * 
FROM `highscores` 
WHERE id IN ((SELECT id 
       FROM highscores 
       WHERE WEEK(date) IN (SELECT DISTINCT WEEK(date) 
            FROM highscores) 
       ORDER BY score DESC)) 
GROUP BY email 
ORDER BY date, score DESC 

但顯然我不能在子查詢

+0

在postgresql中,你可以使用窗口函數,但在MySQL中你沒有它們,你可以使用不那麼強大的GROUP_CONCAT()。也許檢查http://code.openark.org/blog/mysql/sql-selecting-top-n-records-per-group-another-solution。 - 另外,你可以發表你的表的一些示例行嗎? –

+0

您可以發佈帶有樣本數據和預期輸出的表格嗎? – cyadvert

回答

1

使用LIMIT我認爲這應該爲你工作。它也應該帶回領帶,如果有的話(比方說,一週的第5個最高分是兩個人之間的領帶,這會讓他們回到那一週,所以你會有6排周)。

select * 
    from highscores x 
where x.score >= 
     (select max(e.score) 
      from highscores e 
     where week(e.date) = week(x.date) 
      and e.score < 
       (select max(d.score) 
        from highscores d 
       where week(d.date) = week(x.date) 
        and d.score < 
         (select max(c.score) 
          from highscores c 
         where week(c.date) = week(x.date) 
          and c.score < 
           (select max(b.score) 
            from highscores b 
           where week(b.date) = week(x.date) 
            and b.score < 
             (select max(a.score) 
              from highscores a 
             where week(a.date) = week(x.date)))))) 
order by date, score desc 
+0

這裏的努力很好,但對我來說,這看起來有點多餘,並將其排除在MySQL之外。謝謝 – Kendall