在GROUP BY之前订购排行榜

时间:2014-04-16 16:10:44

标签: mysql sql sql-order-by

我有一张包含所有球员结果的表格:

  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

我被困住了。 :(

2 个答案:

答案 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