【问题标题】:mysql group max value rowsmysql组最大值行
【发布时间】:2015-03-28 20:30:42
【问题描述】:

我有这张桌子: - http://sqlfiddle.com/#!9/b3223/1

id entity_id 起息日 1 1 98 2015 年 3 月 28 日 19:58:43 2 1 321 2015 年 3 月 28 日 19:59:54 3 1 123 2015 年 3 月 28 日 19:59:54 4 2 2015 年 3 月 28 日 34 日 20:00:43 5 2 76 2015 年 3 月 28 日 20:00:44

我想列出每个entity_id最新行(按date 值)。

第一个解决方案,错误的也是:-http://sqlfiddle.com/#!9/b3223/2

SELECT id, entity_id, value, MAX(`date`) 来自`gmd` GROUP BY entity_id

其中一个可行的解决方案似乎是: - http://sqlfiddle.com/#!9/b3223/3

SELECT id, entity_id, value, `date`
从 gmd 作为主
日期 = (
    选择最大值(`日期`)
    来自 gmd
    WHERE entity_id = main.entity_id
)
GROUP BY entity_id

我想知道这是否是一个可靠的解决方案,以及是否有其他更优雅的方法可以做到这一点。

谢谢!

【问题讨论】:

  • 还有两个相同的日期?显示每个实体的两条记录?
  • 检查您的第二个查询结果并进行一些数据更改sqlfiddle.com/#!9/ce5ab/1
  • @Beginner ,我明白你的意思,但在这种情况下,结果仍然可以,因为两个日期都相等。虽然可以有第二个值进行比较,并且可以是最高 ID。
  • @SerbuFlorin-Adrian 在这种情况下,请参阅我的帖子。

标签: mysql group-by aggregate-functions


【解决方案1】:

如果您总是想获得具有最高 id 的值(如果它们具有相同的 date),则可以尝试此操作:

SELECT id, entity_id, value, 
  (SELECT MAX(`date`) FROM gmd y WHERE y.id = x.id) AS `date`
FROM  `gmd` x
GROUP BY entity_id DESC
ORDER BY id;

这里是sqlfiddle

【讨论】:

  • 确实,这似乎是一个更好的解决方案,尽管“按最后一个 ID”排序必须在内部以某种方式完成,而不是在查询中指定。我的工作解决方案看起来好多了,谢谢! PS:你能告诉我为什么它实际上选择了最新的ID吗?
  • GROUP BY entity_id DESC 尝试删除DESC
【解决方案2】:

这是另一种方式,但如您所见,有一个平局:

select id, entity_id, value, `date`
  from gmd x
  join (select entity_id, max(date) as `date` from gmd group by entity_id) y
 using (entity_id, `date`)

小提琴:http://sqlfiddle.com/#!9/b3223/11/0

在您的“工作”查询中,选择了value 字段的任意(随机)值,因为它不在您的group by 子句中。在大多数其他数据库中——除了 MySQL——这将返回一个语法错误。

如果您不希望在同一 entity_iddate 的两个 value 值之间出现平局时恢复 value 的两个值,您想如何确定 @ 的哪个值987654330@带回来?

基于 cmets 编辑 -- 如果您想插入“最后”行,则需要通过某种方式在date 之外建立顺序。假设id 字段随时间上升,您可以通过这种方式加入每个entity_id 的最大id

select id, entity_id, value, `date`
  from gmd x
  join (select entity_id, max(id) as id from gmd group by entity_id) y
 using (entity_id, id)

小提琴:http://sqlfiddle.com/#!9/b3223/35/0

【讨论】:

  • 假设如果存在两个日期对于同一个实体 ID 相等的情况,我可以选择最后插入的那个。但是您的查询似乎更“意识到”了这一点,并且在这种情况下它会返回两个值,这可能很有用。我想通过“在你的'工作'查询中”你指的是第一个非工作查询。正确的 ?谢谢!
  • 您只发布了两个查询,您说第一个错误,第二个有效。我指的是第二种。然而,尽管聚合函数位于选择列表中,但它们都有一个 group by 子句排除选择列表中的列,因此它们都有“选择任意行”问题,并且都会在 MySQL 以外的任何数据库中返回语法错误。我添加了第二个查询,假设您的 id 列是一个自动增量字段,该查询应该获取“最后插入的行”。
猜你喜欢
  • 2018-12-04
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多