假设我们有一张表:
+----+---------+-------+--------+
| id | user_id | score | errors |
+----+---------+-------+--------+
| 1 | 123 | 50 | 12 |
| 2 | 123 | 55 | 7 |
| 3 | 444 | 90 | 1 |
| 4 | 555 | 78 | 2 |
| 5 | 123 | 50 | 0 |
+----+---------+-------+--------+
如何为这些MAX分数选择具有MAX分数和错误的3位用户? 我希望得到ids: 3,4和5
P.S。我使用MySql并启用了only_full_group_by
更新:我必须为每个用户获得MAX分数以及确切的字段错误(与该用户的MAX分数相关)
解答: 可以使用以下查询完成。但是,如果一个用户具有两个相同的MAX分数(例如用户123具有2个分数= 50的记录),则它将返回用户的2个记录。在这里我们可以留下最后一条记录(例如,使用PHP或其他语言通过user_id索引)
SELECT t1.user_id, max_score, errors
FROM tbl t1 JOIN (
SELECT max(score) AS max_score, user_id
FROM tbl
GROUP BY user_id
) t2 ON t1.user_id = t2.user_id AND t1.score = t2.max_score;
答案 0 :(得分:1)
要获得3,4,5,您不需要聚合功能并按顺序排序。
使用order by
和limit
:
select id, user_id, score, errors
from my_table
order by score desc, errors desc limit 3
答案 1 :(得分:1)
这只是另一个视角。首先根据每个user_id
的得分降序给出一个rank / row_number。然后我们可以选择rank / row_number值为1的行。
<强>查询强>
SELECT t.id, t.user_id, t.score, t.errors FROM(
SELECT id, user_id, score, errors,
(
CASE user_id WHEN @curA
THEN @curRow := @curRow + 1
ELSE @curRow := 1 AND @curA := user_id END
) AS rn
FROM tblScore t,
(SELECT @curRow := 0, @curA := '') r
ORDER BY user_id, score DESC
)t
WHERE t.rn = 1
ORDER BY t.score DESC;
答案 2 :(得分:0)
按降序排序并获得前3条记录:
Select id, user_id,score, errors FROM [Table_Name] order by score desc,
errors asc limit 3