按行为分组

时间:2017-05-10 15:38:01

标签: mysql group-by greatest-n-per-group

我需要找到组中值最大的行。

我做了很多研究,我找到了很多解决方案:加入,临时表等等。

我仍然想尝试一下“按......来...”,我发现了一些奇怪的东西。

这是我的疑问:

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'

我真的不明白它是如何运作的,它会触发我。

有人能解释一下这种行为吗?

我没有问“怎么做”。我只是不明白“分组......”的工作方式。

2 个答案:

答案 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 )