2014-03-12 60 views
1

分組每週最高得分手細節我有一個表的數據:要顯示按月

id | name | userid | score |  date  | 
-------------------------------------------------------- 
1 | john | 4  | 233 | 2014-02-02 
2 | mary | 5  | 1256 | 2013-02-05 
3 | john | 6  | 100 | 2013-03-08 
4 | elvis | 7  | 123 | 2013-03-04 
5 | john | 2  | 1234 | 2013-03-02 

我想從週日顯示最近month.week開始的每週高分細節。每週顯示最高4分的最高分。我的數據將以json格式輸出。

目前我的查詢輸出只顯示上週的結果。

"weekly_winners":[ 
    { 
     "id":"2", 
     "score":"1256" 
    }, 
    { 
     "id":"1", 
     "score":"233" 
    } 
], 

但是我想表明的樣子

"weekly_winners":[ 
    "week":"1" 
     [ 
      { 
       "id":"2", 
       "score":"1256" 
      }, 
      { 
       "id":"1", 
       "score":"233" 
      } 
     ], 
    "week":"2" 
     [ 
      { 
       "id":"2", 
       "score":"1256" 
      }, 
      { 
       "id":"1", 
       "score":"233" 
      } 
     ], 
], 

我當前的查詢是:

SELECT winner.id,winner.score 
FROM `winner` AS winner 
WHERE winner.date >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY 
    AND winner.date < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY 
ORDER BY winner.score DESC 
LIMIT 4 

回答

1

你可以做的YEARWEEK()命令分組。在週日開始時查看此post

所以你可以使用:YEARWEEK(winner.date, 0)指定星期。

至於按組來選擇排在前面的N行,我發現這樣做的最佳參考是here。向下滾動到部分:

從我用這篇文章在過去解決這一確切的問題每組

選擇最上面的N行。

*注意:YEARWEEK()將處理新的一年,將所有日期設置爲指定的一天,以開始新的一週到上一年的最後一週...如您所預期的那樣。

編輯:

這裏是一個可能的查詢(選擇前兩名,以避免對小提琴例如一堆數據錄入):

SELECT winner.id,winner.score, YEARWEEK(winner.date, 0) 
FROM `winner` AS winner 
WHERE (
    SELECT count(*) 
    FROM winner as w 
    WHERE YEARWEEK(w.date, 0) = YEARWEEK(winner.date, 0) 
     AND w.score >= winner.score 
) <= 2; 

sqlFiddle example

+0

你可以給我舉例查詢 – user3411834

+0

嘗試 - 應該開始接近你所需要的/讓你足夠接近以完成它。添加更多數據並播放。選擇最高的兩個而不是最低的變化。 – Matthew