MySQL为每个user_id选择max,并获得其他字段

时间:2016-10-12 06:23:49

标签: mysql

假设我们有一张表:

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

3 个答案:

答案 0 :(得分:1)

要获得3,4,5,您不需要聚合功能并按顺序排序。

使用order bylimit

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;

SQL Fiddle Demo

答案 2 :(得分:0)

按降序排序并获得前3条记录:

Select id, user_id,score, errors FROM [Table_Name] order by score desc, 
errors asc limit 3