0

私はscoresテーブルを持っています:

id
user
score
date

これで、トップ 10 のハイスコアを簡単に選択できます。

SELECT user, score, date FROM scores ORDER BY score DESC

ただし、ユーザーごとに 1 つのスコア、つまり最高のスコアのみを含めたいと思います。私は次のようなものから始めます

SELECT user, MAX(score) AS score FROM scores GROUP BY user ORDER BY score DESC

しかし、今はdate最高得点を記録していたのに負けてしまいました。どうすれば入手できますか?

4

4 に答える 4

1

JOIN再びテーブルに置くことができます:

SELECT s1.user, max(s1.dt), s2.mxscore as score
FROM scores s1
inner join 
(
    select user, max(score) mxscore
    from scores
    GROUP BY user 
) s2
    on s1.user = s2.user
    and s1.score = s2.mxscore
GROUP BY s1.username, s2.mxscore
ORDER BY score DESC

デモで SQL Fiddle を参照してください

于 2012-08-20T22:15:56.120 に答える
1

実際、 a はまったく必要ありませんGROUP BY

クエリは次のとおりです。

SELECT scores.id, scores.user, scores.score, scores.date
FROM scores
WHERE NOT EXISTS (
  SELECT * 
  FROM scores AS _scores
  WHERE _scores.user = scores.user
  AND (
    _scores.score > scores.score
    OR
    _scores.score = scores.score AND _scores.id < scores.id) 
)

およびSQL Fiddleで動作を確認します。

このクエリは、ユーザーが最大スコアを数回取得した場合を適切に処理することに注意してください (最初の最大スコアのレコードが返されます)。

于 2012-08-21T00:47:42.710 に答える
0

結果を元のテーブルに関連付ける必要があります。

select a.user, a.maxScore, b.maxDate
from (
    select user, max(score) as maxScore 
    from scores group by user ) as a
inner join (
    select user, score, max(date) as maxDate 
    from scores group by user, score) as b on a.user = b.user and a.maxScore=b.score
order by
    a.maxScore desc

このクエリは、各ユーザーの最大スコアと、この最大スコアが記録された最後の日付を返します (冗長ですが、真実です)。

于 2012-08-20T22:16:17.327 に答える
0
SELECT   a.*
FROM     scores a
JOIN     (
         SELECT   MAX(a.id) AS id
         FROM     scores a
         JOIN     (
                  SELECT   user, MAX(score) AS score
                  FROM     scores
                  GROUP BY user
                  ) b ON a.user  = b.user
                     AND a.score = b.score
         GROUP BY a.user, 
                  a.score
         ) b ON a.id = b.id
ORDER BY a.score DESC

これにより、ユーザーごとに同じ最高スコアが複数ある場合が考慮されます。その場合、最大値がかかりますid

于 2012-08-20T22:21:34.037 に答える