MySQL/MariaDB GROUP BY, ORDER BY returns 同样的结果两次

MySQL/MariaDB GROUP BY, ORDER BY returns same result twice

假设我有以下 table

+----+--------+--------+
| id | result | person |
+----+--------+--------+
|  1 |      1 |      1 |
|  2 |      2 |      2 |
|  3 |      2 |      2 |
|  4 |      4 |      3 |
|  5 |      4 |      1 |
|  6 |      1 |      2 |
+----+--------+--------+

现在我想得到每个人从高到低排序的最佳结果,其中最佳结果意味着 result 列的最高值,所以基本上我想 GROUP BY person 和按 result 排序。此外,如果一个人多次获得相同的结果,我只想 return 想要其中一个结果。所以我想要的 return 是这样的:

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

但是return同一个人的两行,如果这个人两次做出相同的最好成绩,那么我得到的是

+----+--------+--------+
| id | result | person |
+----+--------+--------+
|  4 |      4 |      3 |
|  5 |      4 |      1 |
|  2 |      2 |      2 |
|  3 |      2 |      2 |
+----+--------+--------+

如果同一个人的两个结果相似,只有 ID 最低的那个应该被 returned,所以不要 returning id 为 2 和 3 的行,只有 id 的行2 应该 returned.

有什么实现方法吗?

检查 tmp 是否产生正确的结果 table。我认为 tmp 应该正确分组。连接会添加新行,因为您有不同的 "id" 值。 因此,具有不同 id 的行将被视为不同的行,无论其他列是否相等。只要没有重复的 id,就没有重复的结果。尝试从 SELECT 中删除 id。那么你应该得到你想要的结果,但是没有id。

示例:从上面想象一下带有您的 ID 的房间。让 result 为房间中 tables 的数量,person 为人数。仅仅因为您在房间 2 和房间 3 中随机拥有相同数量的 table 和人,并不意味着这是相同的房间。

试试这个:

SELECT ttable.* from ttable 
inner join 
(
SELECT max(ttable.id) as maxid  FROM `ttable` 
inner join  (SELECT max(`result`) as res, `person` FROM `ttable` group by person) t
on
ttable.result = t.res
and
ttable.person =  t.person

group by ttable.person ) tt
on
ttable.id = tt.maxid