2

クイズの結果表があります。ユーザーはカテゴリごとに何度でも挑戦できます。各カテゴリの最高スコアと対応するタイムスタンプが必要です。

だから私は本当に近いですが、タイムスタンプフィールドが私を殺しています.

ここに 1 つのユーザー データがあります: (「スコア」は %s を含む varchar です。これが私が渡されたものです。また、カテゴリ、次に最高スコア、次にタイムスタンプで並べ替えられています。各カテゴリの最初の行を取得できれば完了です。)

catid  score   timestamp
5   100%    2012-03-22 19:26:41
6   88.89%  2012-06-12 15:20:41
6   77.78%  2012-06-12 15:17:58
7   100%    2012-06-12 16:08:35
7   100%    2012-06-12 16:03:35
7   53.33%  2012-06-12 15:59:44
8   88.89%  2012-06-12 16:13:00
9   83.33%  2012-06-12 16:22:19
10  100%    2012-06-12 17:55:50
10  76.47%  2012-06-12 17:51:54
11  100%    2012-06-12 18:07:12
11  66.67%  2012-06-12 18:05:35

必要なものは次のとおりです。

catid  score          timestamp
5   100%    2012-03-22 19:26:41
6   88.89%  2012-06-12 15:20:41
7   100%    2012-06-12 16:08:35
8   88.89%  2012-06-12 16:13:00
9   83.33%  2012-06-12 16:22:19
10  100%    2012-06-12 17:55:50
11  100%    2012-06-12 18:07:12

私が使用しているMySQLは次のとおりです。

SELECT catid
 , MAX(0 + score)
 , `timestamp`

FROM `results` 
WHERE userid = 100
GROUP BY catid
ORDER BY catid ASC
 , (0 + score) DESC
 , timestamp DESC
;

そして、それが生成しているテーブル:

5   100 2012-03-22 19:26:41
6   88.89   2012-06-12 15:17:58
7   100 2012-06-12 15:59:44
8   88.89   2012-06-12 16:13:00
9   83.33   2012-06-12 16:22:19
10  100 2012-06-12 17:51:54
11  100 2012-06-12 18:05:35

とても近いですが、タイムスタンプは最高値に関連付けられたものではありません。何が起こっていて、どうすれば修正できますか?

ありがとう!

4

2 に答える 2

2

文字列の代わりに数値型を使用してパーセンテージを格納すると、テーブルは328倍素晴らしいものになります。ただし、この回答では、この問題を無視しますが、実際にはできるだけ早く修正する必要があります。

次のように問題を解決できます。

SELECT catid, score, MAX(timestamp) AS timestamp
FROM results
WHERE userid = 100
AND (catid, CAST(score AS DECIMAL(5,2))) IN
(
    SELECT catid, MAX(CAST(score AS DECIMAL(5,2))) AS score
    FROM results
    WHERE userid = 100
    GROUP BY catid   
)
GROUP BY catid

オンラインで動作することを確認してください:sqlfiddle

または、日時を文字列としてフォーマットします:sqlfiddle

結果

CATIDスコアのタイムスタンプ
5 100%2012-03-22 19:26:41
6 88.89%2012-06-12 15:20:41
7 100%2012-06-12 16:08:35
8 88.89%2012-06-12 16:13:00
9 83.33%2012-06-12 16:22:19
10100%2012-06-12 17:55:50
11 100%2012-06-12 18:07:12
于 2012-07-12T23:45:16.680 に答える
0
SELECT MAX(score), catid, timestamp FROM db.table GROUP BY catid ORDER BY score DESC;
于 2012-07-12T22:59:41.353 に答える