SELECT *
FROM (SELECT id, user, MAX(score) FROM table_1 GROUP BY user) AS sub
ORDER BY 'sub.score' ASC;
Run Code Online (Sandbox Code Playgroud)
此SQL查询应从表中仅选择每个用户的得分,并且为准确起见,得分最高。
表结构是这样的:
+-----------------------+
| id | score | username |
+-----------------------+
| 1 | 15 | mike |
| 2 | 23 | tom |
| 3 | 16 | mike |
| 4 | 22 | jack |
etc..
Run Code Online (Sandbox Code Playgroud)
结果应为:
3 mike 16
2 tom 23
4 jack 22
Run Code Online (Sandbox Code Playgroud)
然后重新排序:
3 mike 16
4 jack 22
2 tom 23
Run Code Online (Sandbox Code Playgroud)
但是查询不会按分数对子查询重新排序。怎么做?
让我们一步一步看一下您正在做什么:
SELECT id, user, MAX(score) FROM table_1 GROUP BY user
Run Code Online (Sandbox Code Playgroud)
在这里,您按用户名分组,因此每个用户名得到一个结果行。在此结果行中,选择用户名,为此用户名找到的最高分(“ mike”为16)和为该用户名找到的ID之一(“ mike”为1或3), DBMS可以自由选择一个)。这可能不是您想要的。
SELECT * FROM (...) AS sub ORDER BY 'sub.score' ASC;
Run Code Online (Sandbox Code Playgroud)
'sub.score'是一个字符串(单引号)。您想按子查询的最高分来排序。因此,首先给它max(score)命名,例如max(score) as max_score,然后访问:ORDER BY sub.max_score ASC。
无论如何,如果您希望记录的用户名得分最高(也要获得相应的ID),则可以查找不存在具有相同用户名和更高得分的记录的记录。排序很容易:由于没有聚合,您只需按分数排序:
select * from table_1 t1 where not exists
(select * from table_1 higher where higher.name = t1.name and higher.score > t1.score)
order by score;
Run Code Online (Sandbox Code Playgroud)