我需要找到组中值最大的行。
我做了很多研究,我找到了很多解决方案:加入,临时表等等。
我仍然想尝试一下“按......来...”,我发现了一些奇怪的东西。
这是我的疑问:
SELECT MAX(id) AS MaxValue, MyTable.*
FROM MyTable
GROUP BY name
HAVING id = MaxValue
我得到一个行列表作为结果,但我没有为每个名称添加一行。
我这样做时会获得很多行:
SELECT * FROM MyTable WHERE name = 'John'
但是第一个查询的结果不包含任何名为“John”的行,如果我这样做,我什么也得不到:
SELECT MAX(id) AS MaxValue, MyTable.*
FROM MyTable
GROUP BY name
HAVING id = MaxValue AND name = 'John'
我真的不明白它是如何运作的,它会触发我。
有人能解释一下这种行为吗?
我没有问“怎么做”。我只是不明白“分组......”的工作方式。
答案 0 :(得分:0)
如果您希望按名称划分max id group的行是
select * from
MyTable where id in (SELECT MAX(id)
FROM MyTable
GROUP BY name
)
或者如果你只需要约翰的行
select * from
MyTable where id in (SELECT MAX(id)
FROM MyTable
GROUP BY name
)
where name = 'John';
答案 1 :(得分:0)
您需要做的是计算每个名称的最大ID。为此,您使用简单的GROUP BY
。
SELECT name, MAX(id) as MaxValue
FROM YourTable
GROUP BY name
现在,您执行JOIN
或一次IN
比较,以查看哪一行具有MaxValue。这有很多方法可以做到。你总是应该检查EXPLAIN PLAN
以查看优化器正在做什么,以及是否正在使用正确的索引。
我宁愿使用JOIN
aproach。您尝试将表格与上一个查询中已找到的值匹配的位置。
SELECT *
FROM YourTable YT
JOIN ( SELECT name, MAX(id) as MaxValue
FROM YourTable
GROUP BY name
) MaxT
ON YT.name = MaxT.name
AND YT.id = MaxT.MaxValue
现在,如果ID不是每个名称的唯一值,则可能会出现问题,并且可以返回重复的行,因此如果只需要一个结果,则需要考虑其他问题。
还可以选择为每一行使用子查询。在这里,您从外部表中获取name
,并使用它在内部子查询中查找该名称的Max(ID)
。此方法也可能与重复项具有相同的问题
SELECT *
FROM YourTable YT
WHERE id = ( SELECT MAX(MaxT.id)
FROM YourTable MaxT
WHERE MaxT.name = YT.name )