Mysql 按行为分组

Mysql 按行为分组,mysql,group-by,greatest-n-per-group,Mysql,Group By,Greatest N Per Group,我需要找到组中具有最大值的行 我做了很多研究,发现了很多解决方案:join、临时表等等 但我还是想尝试一下order by。。。有。。。我发现了一些奇怪的东西 这是我的疑问: SELECT MAX(id) AS MaxValue, MyTable.* FROM MyTable GROUP BY name HAVING id = MaxValue 结果是我得到了一个行列表,但并不是每个名字都有一行 执行此操作时,我会获得许多行: SELECT * FROM MyTable WHERE name

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

我做了很多研究,发现了很多解决方案:join、临时表等等

但我还是想尝试一下order by。。。有。。。我发现了一些奇怪的东西

这是我的疑问:

SELECT MAX(id) AS MaxValue, MyTable.* 
FROM MyTable
GROUP BY name
HAVING id = MaxValue
结果是我得到了一个行列表,但并不是每个名字都有一行

执行此操作时,我会获得许多行:

SELECT * FROM MyTable WHERE name = 'John'
SELECT MAX(id) AS MaxValue, MyTable.* 
FROM MyTable
GROUP BY name
HAVING id = MaxValue AND name = 'John'
但是第一个查询的结果不包含任何名为“John”的行,如果执行此操作,则不会得到任何结果:

SELECT * FROM MyTable WHERE name = 'John'
SELECT MAX(id) AS MaxValue, MyTable.* 
FROM MyTable
GROUP BY name
HAVING id = MaxValue AND name = 'John'
我真的不明白它是如何工作的,它触发了我

有人能解释我的这种行为吗


我没问怎么做。我只是不明白团队是如何。。。having起作用。

如果您想按名称显示max id组的行,请选择一种方式

  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';

您需要做的是计算每个名称的最大id。为此,您使用一个简单的分组方式

现在执行联接或比较中的一个,以查看哪一行具有最大值。这有很多方法可以做到。您应该始终检查EXPLAIN计划,查看优化器在做什么,以及是否使用了正确的索引

我宁愿用JOIN这个词。尝试将表与上一个查询中已找到的值进行匹配

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不是每个名称的唯一值,并且可能返回重复的行,那么这可能会有问题,所以如果只需要一个结果,则需要考虑其他问题

还可以为每一行使用子查询。在这里,您从外部表获取名称,并使用它在内部子查询中查找该名称的MaxID。此方法对于重复项也可能有相同的问题

 SELECT *
 FROM YourTable YT
 WHERE id = ( SELECT MAX(MaxT.id)
              FROM YourTable MaxT
              WHERE MaxT.name = YT.name )

我需要找到组中具有最大值的行。-分组方式对此没有帮助。它不会从表中返回行,而是使用每个组的数据生成新行。它从独立于其他表达式的SELECT子句计算每个表达式。一般情况下,请选择*。。。GROUP BY是无效的SQL。您说SELECT*…无效是什么意思。。。分组?我使用mySQL,没有任何错误。你是说这是坏习惯?无效意味着不正确。SQL标准对可以出现在GROUPBY查询的SELECT子句中的表达式设置了一些限制,这是有充分理由的。大多数RDBME遵循标准并拒绝无效查询。在版本5.7.5之前,MySQL接受它们,但是。从5.7.5开始,默认情况下该行为是可配置的,它会拒绝这些行为,我想将来它不会再接受它们了。阅读更多:我明白了。我想当我这样做的时候,也会遇到同样的问题:从MyTable GROUP中选择id,MAXid作为MaxValue,名称为id=MaxValue,请看一看。如果您查询一个表,那么您可以从该答案中获得想法,并编写符合您需要的查询。这是做这项工作最快的方法。如果需要使用联接查询多个表,那么最好尝试下面答案中提供的查询之一。他们不会跑那么快,但他们会在没有其他问题的情况下完成这项工作。谢谢你的建议,但我已经了解他们了。我的问题是我不理解第一个查询的行为。为什么缺少行?select格式让我发疯了:/这个假设id是MyTable中的主键或唯一值,即使不保证这是一个好的假设。@JuanCarlosOropeza可能是。。希望OP能给我们一些建议。。我已经发现了这个解决方案。还是很高兴能有它在这里!我注意到按名称将SELECT name、MAXid作为MaxValue从您的表组中写入是可以的。但这不是:按名称从表组中选择任何其他列、名称、MAXid作为MaxValue。使用分组依据时,是否有规则规定所选值只能是用于分组或特定功能的字段?是的,有规则。。。。但是在mysql中你可以忽略它,顺便说一句,我们不喜欢这个。新版本有一种打开/关闭规则的方法。但规则是,select上的每个字段都必须位于GROUP BY上,或者位于聚合函数(如MAX、COUNT或SUM)中。因此,您还有问题吗?现在GROUP BY的工作原理更清楚了。我被这种行为所触动,现在我更好地理解了它。非常感谢。