可能是重复的问题:
按GROUP BY排序的SQL ORDER BY总和
更新:我已经找到了我的解决方案,我已经在这里发布了。感谢大家的帮助!
我正在开发一个需要排行榜的Facebook应用程序。得分和完成游戏所需时间会被记录下来,首先按照得分进行排序,如果有两个相同的得分,则使用时间进行排序。如果用户多次玩游戏,则使用他们最好的成绩。
游戏表现越好,得分就越低。
我的表格结构如下:
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 - 并且只是覆盖值。
使用 MIN(score) 和 group by 一起选择最低分数是正确的 - 然而它合并了用户在数据库中的第一条记录的时间,因此经常返回不正确的结果。
那么,如何选择用户的最高分数和关联的时间、名称等,并按照分数和时间排序结果?
提前感谢!
UNIQUE
索引。 - hjpotter92