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
假设我有以下 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