GROUP BY之后的ORDER BY不起作用

时间:2016-10-30 22:59:16

标签: mysql sql

SELECT * 
FROM (SELECT id, user, MAX(score) FROM table_1 GROUP BY user) AS sub
ORDER BY 'sub.score' ASC;

此SQL查询应该从表中仅选择每个用户的分数,并且为了准确性,选择最高分数。

表结构如下:

+-----------------------+
| id | score | username |
+-----------------------+
| 1  |    15 |     mike |
| 2  |    23 |     tom  |
| 3  |    16 |     mike |
| 4  |    22 |     jack |

etc..

结果应该是:

3 mike 16
2 tom  23
4 jack 22

然后重新排序:

3 mike 16
4 jack 22
2 tom  23

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

3 个答案:

答案 0 :(得分:4)

让我们一步一步看看你在做什么:

SELECT id, user, MAX(score) FROM table_1 GROUP BY user

此处您按用户名进行分组,因此每个用户名可获得一个结果行。在此结果行中,您可以选择用户名,为此用户名找到的最高分数(对于' mike'为16)以及为用户名找到的ID之一(可以是1或3 ' mike',DBMS可以自由选择一个)。这可能不是你想要的。

SELECT * FROM (...) AS sub  ORDER BY 'sub.score' ASC;

' 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;

答案 1 :(得分:2)

假设用户得分是唯一的..:

SELECT x.*
   FROM table_1 x
  JOIN ( SELECT user, MAX(score) score FROM table_1 GROUP BY user) y 
    ON y.user = x.user 
   AND y.score = x.score
 ORDER BY x.score 

答案 2 :(得分:1)

无需编写子查询。 只需你可以这样使用:

SELECT id, `user`, MAX(score) FROM table_1 GROUP BY `user`
ORDER BY MAX(score);

如果您想查询子查询:

SELECT * FROM (SELECT id, `user`, MAX(score) as max_score FROM table_1
GROUP BY `user`) AS sub ORDER BY max_score;