假设我有下表
+----+--------+--------+
| 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的行。
有任何想法如何实现这个?
答案 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号房间随机抽取了相同数量的桌子和人,这并不意味着这是同一个房间。