重複の可能性:
GROUP BY 内の SQL ORDER BY 合計
更新:ここに投稿した解決策を見つけました。助けてくれてありがとう!
リーダーボードを必要とする Facebook アプリケーションを開発しています。ゲームを完了するのにかかったスコアと時間が記録され、これらは最初にスコアで整理され、次に2つの同一のスコアの場合は時間が使用されます. ユーザーが複数回プレイした場合、最高のスコアが使用されます。
スコアが低いほど、ゲームのパフォーマンスが向上します。
私のテーブル構造は次のとおりです。
id
facebook_id - (Unique Identifier for the user)
name
email
score
time - (time to complete game in seconds)
timestamp - (unix timestamp of entry)
date - (readable format of timestamp)
ip
私がうまくいくと思ったクエリは次のとおりです。
SELECT *
FROM entries
ORDER BY score ASC, time ASC
GROUP BY facebook_id
私が抱えている問題は、場合によっては、データベース内のユーザーの最高スコアではなく、最初のスコアを取得していることです。これは GROUP BY ステートメントにかかっていると思います。ORDER BY ステートメントでこれが修正されると思っていましたが、明らかにそうではありませんでした。
例えば:
----------------------------------------------------------------------------
| ID | NAME | SCORE | TIME | TIMESTAMP | DATE | IP |
----------------------------------------------------------------------------
| 1 | Joe Bloggs | 65 | 300 | 1234567890 | XXX | XXX |
----------------------------------------------------------------------------
| 2 | Jane Doe | 72 | 280 | 1234567890 | XXX | XXX |
----------------------------------------------------------------------------
| 3 | Joe Bloggs | 55 | 285 | 1234567890 | XXX | XXX |
----------------------------------------------------------------------------
| 4 | Jane Doe | 78 | 320 | 1234567890 | XXX | XXX |
----------------------------------------------------------------------------
上記のクエリを使用すると、次の結果が得られます。
1. Joe Bloggs - 65 - 300 - (Joes First Entry, not his best entry)
2. Jane Doe - 72 - 280
私は期待していただろう...
1. Joe Bloggs - 55 - 285 - (Joe's best entry)
2. Jane Doe - 72 - 280
Group By が Order を無視しているようで、値を上書きしているだけです。
group by で MIN(score) を使用すると、最も低いスコアが選択されますが、これは正しいですが、データベース内のユーザーの最初のレコードから時間がマージされるため、多くの場合、誤って返されます。
では、ユーザーの最高スコアと関連する時間、名前などを選択し、結果をスコア、次に時間で並べ替えるにはどうすればよいでしょうか?
前もって感謝します!