mysql 分组最大值行

mysql group max value rows

我有这个table: - http://sqlfiddle.com/#!9/b3223/1

id  entity_id   value   date
1   1           98      March, 28 2015 19:58:43
2   1           321     March, 28 2015 19:59:54
3   1           123     March, 28 2015 19:59:54
4   2           34      March, 28 2015 20:00:43
5   2           76      March, 28 2015 20:00:44

我想为每个 entity_id.

列出 最新行 (按 date 值)

第一种解法,错误的也是:- http://sqlfiddle.com/#!9/b3223/2

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

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

SELECT id, entity_id, value,  `date` 
FROM gmd AS main
WHERE DATE = ( 
    SELECT MAX(  `date` ) 
    FROM gmd
    WHERE entity_id = main.entity_id 
) 
GROUP BY entity_id

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

谢谢!

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

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`)

Fiddle: http://sqlfiddle.com/#!9/b3223/11/0

在您的 'working' 查询中,选择了 value 字段的任意(随机)值,因为它不在您的 group by 子句中。在大多数其他数据库中——除了 MySQL——这将是 return 语法错误。

如果您不希望 value 的两个值在相同 entity_iddatevalue 的两个值之间出现平局时返回你想如何决定要带回 value 的哪个值?

根据评论编辑 -- 如果您想要插入 'last' 行,则需要某种方式来建立 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)

Fiddle: http://sqlfiddle.com/#!9/b3223/35/0

如果你总是想获得具有最高 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.