2011-07-01 13 views
2

私は以下のようなテーブル構造を持っています。各行は1つのゲームであり、各人は毎月多くの時間を再生することができます。MySQL - get sum()グループのmax()グループ

 
id | person | score | date | 
------------------------------------ 
1 | 32 | 444 | 2011-05 | 
2 | 65 | 528 | 2011-05 | 
3 | 77 | 455 | 2011-05 | 
4 | 32 | 266 | 2011-06 | 
5 | 77 | 100 | 2011-06 | 
6 | 77 | 457 | 2011-06 | 
7 | 77 | 457 | 2011-06 | 
8 | 65 | 999 | 2011-07 | 
9 | 32 | 222 | 2011-07 | 

私は毎月最高の得点を得たいと思っています。上記のSの結果は次のようになります。

 
person | SUM(ofbestofeachmonth) 
--------------------------------- 
    32  | 932 
    65  | 1527 
    77  | 912 

私は私が年の四半期ごとの最終出力に必要なので、今、userin月または一部の範囲

 
SELECT person, date, MAX(score) FROM tabgames WHERE MONTH(date) = 6 GROUP BY person HAVING (score>0) 

あたりの自己ベストスコアを取得する方法を知っています私は毎月ベストをフェッチしていますが、MySQLの外では追加しています。

今、私はグループワイズmaxについて読んでいますが、それでもなお良い結果を得ようとしています。すべてのヘルプ

答えて

6

サブクエリ:

SELECT person, SUM(best) 
FROM 
    (SELECT person, MAX(score) as best 
    FROM tabgames 
    WHERE MONTH(`date`) >= 1 AND MONTH(`date`) <= 6 
    GROUP BY person, MONTH(`date`)) as bests 
GROUP BY person 

は今サブクエリは、人とMONTH(日付)によってグループ化されるので、各月の行を返します。

+0

私はこのように考えましたが、このサブクエリは、各月の最大値ではなく、全範囲で各人の最大得点を返します。いくつかの結合がありますが、まだ試着している必要があります – carpereret

+0

あなたは正しいです。私は私の答えを編集しました。今すぐ試してください。 – jakubka

+0

ありがとう、それです。注意:私の場合ではありませんが、年の回転が範囲であれば間違った行を返すかもしれません - ちょうどYEARをどこに追加してください。 – carpereret

0
Select t.person,Max(t.Score) from 
(
Select person,Sum(Score) as Score,Month('Date') as [Month] From tabgames 
WHERE MONTH(`date`) >= 1 AND MONTH(`date`) <= 6 
GROUP BY PERSON,Month 

) AS t 
+1

可読性のために: 'どこの日付(日付)> = 1そして月(日付)<= 6 'を書き換えることができます:'月間(日付)1と6の間 –