GROUP BY后ORDER BY不起作用

Nor*_*ber 3 mysql sql

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)

但是查询不会按分数对子查询重新排序。怎么做?

Tho*_*ner 5

让我们一步一步看一下您正在做什么:

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)