我在数据库中有一个表。具有序列号(User-no)的用户(Name)可以多次玩。每次用户玩游戏时,都会生成一个新的 ID(Id),并将其与分数(Score)一起存储在数据库中。我想从表中获取前三个分数,其中仅显示每个用户的最高分数。
表:
<小时/>ID |用户号 |名称 |得分
1 | 1 |姓名1 | 400
2 | 2 |姓名2 | 700
3 | 3 |姓名3 | 100
4 | 2 |姓名2 | 500
5 | 4 |名称4 | 800
6 | 3 |姓名3 | 200
7 | 1 |姓名1 | 500
8 | 4 |名称4 | 700
结果应该是:
<小时/>ID |用户号 |名称 |得分
5 | 4 |名称4 | 800
2 | 2 |姓名2 | 700
7 | 1 |姓名1 | 500
怎样才能得到上面的结果。我正在使用 MySQL。
最佳答案
这可以通过派生表上的联接来完成,尽管您需要正确的索引才能使其高效
select id, uid, name, score
from scores
join (select uid, max(score) as score from scores group by uid) t
using (uid, score)
order by score desc
limit 3;
+------+------+------+-------+
| id | uid | name | score |
+------+------+------+-------+
| 5 | 4 | n4 | 800 |
| 2 | 2 | n2 | 700 |
| 7 | 1 | n1 | 500 |
+------+------+------+-------+
3 rows in set (0.00 sec)
编辑:正确的索引是(uid,分数)。派生表没有索引,因此 mysql 会循环遍历最大分数结果并从主表中提取匹配的行。
关于mysql - 从 MySQL 获取最大不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27212169/