MySQL / MariaDB GROUP BY,ORDER BY返回两次相同的结果

时间:2015-03-04 09:14:10

标签: mysql group-by sql-order-by mariadb

假设我有下表

+----+--------+--------+
| 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和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的行。

有任何想法如何实现这个?

2 个答案:

答案 0 :(得分:2)

试试这个:

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

答案 1 :(得分:0)

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

示例:想象一下您的身份来自上方的房间。让结果是房间中的桌子数量和人数。仅仅因为你在2号和3号房间随机抽取了相同数量的桌子和人,这并不意味着这是同一个房间。