【发布时间】:2015-05-05 05:01:36
【问题描述】:
假设我有下表
+----+--------+--------+
| id | result | person |
+----+--------+--------+
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 2 | 2 |
| 4 | 4 | 3 |
| 5 | 4 | 1 |
| 6 | 1 | 2 |
+----+--------+--------+
现在我想按从高到低排序的每个人得到最好的结果,其中最好的结果意味着result-column 的最高值,所以基本上我想 GROUP BY person 和 ORDER BY result。此外,如果一个人多次获得相同的结果,我只想返回其中一个结果。所以我想要的回报是这样的:
+----+--------+--------+
| id | result | person |
+----+--------+--------+
| 4 | 4 | 3 |
| 5 | 4 | 1 |
| 2 | 2 | 2 |
+----+--------+--------+
以下查询几乎可以让我到达那里:
SELECT id, groupbytest.result, groupbytest.person
FROM groupbytest
JOIN (
SELECT MAX(result) as res, person
FROM groupbytest
GROUP BY person
) AS tmp
ON groupbytest.result = tmp.res
AND groupbytest.person = tmp.person
ORDER BY groupbytest.result DESC;
但是为同一个人返回两行,如果此人两次取得相同的最佳结果,那么我得到的是
+----+--------+--------+
| id | result | person |
+----+--------+--------+
| 4 | 4 | 3 |
| 5 | 4 | 1 |
| 2 | 2 | 2 |
| 3 | 2 | 2 |
+----+--------+--------+
如果同一个人的两个结果相似,则应仅返回 id 最低的一个,因此不应返回 id 为 2 和 3 的行,而应仅返回 id 为 2 的行。
有什么想法可以实现吗?
【问题讨论】:
-
如果出现平局,应该怎么做呢?
-
@Strawberry 应该只返回一个(假设是具有最低 id 的那个)结果。因此,应该只返回 id 为 2 的行,而不是返回 id 为 2 和 3 的行。
-
请相应地编辑您的问题。
标签: mysql group-by sql-order-by mariadb