我有这张桌子: - 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
我想列出每个date
的最新行(按entity_id
值)。
第一个解决方案,错误的解决方案也是: - 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
我想知道这是否是一个可靠的解决方案,还有其他更优雅的方法可以做到这一点。
谢谢!
答案 0 :(得分:1)
这是另一种方式,但正如你所看到的,有一个平局:
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之外 - 这将返回语法错误。
如果您不希望value
的两个值在同一value
和entity_id
的{{1}}的两个值之间出现问题时返回你想如何决定带回date
的哪个值?
根据评论进行编辑 -
如果你想要最后一个'在那里插入的行需要某种方式来建立超出value
的顺序。假设date
字段随时间而上升,您可以通过这种方式加入每个id
的最大id
:
entity_id
答案 1 :(得分: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。