更新:我发现我的解决方案,我已经张贴here。感谢大家的帮助!
我正在开发一个需要排行榜的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忽略了订单 - 只是重写了这些值。
通过选择最低分数来使用MIN(分数),这是正确的 - 但它会合并数据库中用户第一条记录的时间,因此经常返回不正确。
那么,我该如何选择用户的最高分和关联的时间,名称等,然后按时间顺序排列结果?
在此先感谢!
WHERE条件严重缺失。当使用'GROUP BY'时,引擎有权从分组项中选择绝对的任何列,即使从每列的不同行开始。 – biziclop
'ORDER BY'在'GROUP BY'之后__。 – vyegorov
'select ...,max(score)'? – teran