我有一张包含所有球员结果的表格:
id |result| user_id
------------------------
1 | 130 | 5C382072
2 | 145 | 5C382072
3 | 130 | 8QHDTz7w
4 | 166 | 6155B6D0
5 | 100 | DFSA3444
较小的结果更好。我需要查询排行榜。 每个玩家必须在排行榜中出现一次并获得最佳结果。如果2个玩家的结果相同,那么id较小的玩家应首先出现。 所以我期待这个输出:
id |result| user_id
------------------------
5 | 100 | DFSA3444
1 | 130 | 5C382072
3 | 130 | 8QHDTz7w
4 | 166 | 6155B6D0
我无法获得所需的结果,导致按user_id
进行分组,然后按result, id
排序。
我的代码:
SELECT id, MIN(result), user_id
FROM results
GROUP BY user_id
ORDER BY result, id
它会输出接近所需结果的内容,但id
字段未连接到用户结果最小的行,它可以是来自具有相同id
的组的任何user_id
。因为id
的排序根本不起作用。
编辑:
我之前没有提到的是,我需要处理用户具有相同结果的情况。
我想出了两个我不喜欢的解决方案。 :)
1)有点慢和丑:
SELECT t1.*
FROM (SELECT * FROM results WHERE results_status=1) t1
LEFT JOIN (SELECT * FROM results WHERE results_status=1) t2
ON (t1.user_id = t2.user_id AND (t1.result > t2.result OR (t1.result = t2.result AND t1.id > t2.id)))
WHERE t2.id IS NULL
ORDER BY result, id
2)慢十倍但更清晰:
SELECT *
FROM results t1
WHERE id = (
SELECT id
FROM results
WHERE user_id = t1.user_id AND results_status=1
ORDER BY result, id
LIMIT 1
)
ORDER BY result, id
我被困住了。 :(
答案 0 :(得分:1)
编辑:我认为你需要一个子查询:
SELECT a.id, a.result, a.user_id FROM results a
WHERE a.user_id, a.result IN (SELECT b.user_id, MIN(b.result) FROM results b
GROUP BY b.user_id)
ORDER BY a.user_id
如果相同的用户多次获得相同的分数,则会返回未定义的id
,但会正确地对用户进行排序,并将id
与正确的user_id
匹配。
答案 1 :(得分:1)
这应该让你接近。避免MySQL的宽松(错误)GROUP BY语法,它允许您形成GROUP BY子句,而无需从SELECT列表中命名未聚合的列。改为使用标准SQL的GROUP BY语法。
select t.user_id, m.min_result, min(t.id) id
from results t
inner join (select user_id, min(result) min_result
from results
group by user_id) m
on t.user_id = m.user_id
and t.result = m.min_result
group by t.user_id, m.min_result