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
但查询不会按分数对子查询重新排序。怎么做?
答案 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;