0

私はゲームとユーザーのスコアの表を持っています。ユーザーはゲームごとに多くのスコアを持つことができます:

USER    GAME    SCORE   TIMESTAMP
1       1       125     123456
2       1       120     123457
1       2       10293   123458
2       2       10253   123459
1       1       130     123460

明らかに、より多くのユーザーとゲームが存在しますが、おわかりのように、特定の時間枠でスコアを取得するために、取得したすべてのスコアをログに記録し、タイムスタンプと共に保存しています。

私がする必要があるのは、たとえば、ゲームでユーザーの個々のランクを取得することです。

user 1 - game 1 - rank 1
user 2 - game 1 - rank 2

しかし、クエリを実行しています

SELECT COUNT(DISTINCT user) 
FROM scores 
WHERE game = 1 
AND score > $user_2_score 
AND timestamp < $time_limit 
ORDER BY score DESC

ユーザー 1 のスコアが 2 点高いため、このユーザーは 3 位になります。COUNT(DISTINCT user)問題が解決すると思っていましたが、何らかの理由で解決しませんでした。

(明らかに、別のクエリからユーザーの最高スコアを取得し、それをこのクエリに渡しています)

MySQLでこれを行う方法はありますか、またはより良い結果を得るために使用できるより良いクエリはありますか?

4

2 に答える 2

1

おそらく GROUP BY を使用する方が良いでしょう:

SELECT user,game, SUM(score) AS scorer
FROM scores 
GROUP BY user, game
ORDER BY scorer DESC
于 2012-09-21T08:24:10.910 に答える
0

正確なゲームの結果を取得したい場合は、次のクエリを使用できます -

SELECT
  user,
  SUM(score) sum_score,
  @r:=@r + 1 rank
FROM
  scores, (SELECT @r:=0) t
WHERE
  game = 1
GROUP BY
  user
ORDER BY
  sum_score DESC;
于 2012-09-21T08:50:09.483 に答える