我有一个表格,其中显示订单号、订单说明以及下达日期。
有时订单号会重复。我想获取所有带有描述的唯一订单号,但仅在出现重复时显示最新的订单号
orderID orderInfo dateAdded
1 cheese 2014-10-01
1 cheese+ 2014-10-02
1 cheese&tomato 2014-10-03
2 bacon 2014-10-05
2 bacon 2014-10-04
2 bacon 2014-10-02
3 tuna 2014-09-30
所以我的查询应该返回:
orderID orderInfo dateAdded
1 cheese&tomato 2014-10-03
2 bacon 2014-10-05
3 tuna 2014-09-30
我已经尝试过:
select orderID, orderInfo from orders group by orderID
但这只是给了我每个 orderID 的第一个,我如何让它选择最新的?
最佳答案
你可以简单地LEFT JOIN
table 本身on orderID
AND 添加连接条件,t1.dateAdded < t2.dateAdded
。
最后你选择结果,其中 t2.dateAdded
为空,并且您拥有每个订单的最新条目。
(因为这样,您当前在 t1
中得到的结果就是加入组内的最新日期)
SELECT
*
FROM
test t1
LEFT JOIN
test t2
ON
t1.id = t2.id AND
t1.dateAdded < t2.dateAdded
WHERE
ISNULL (t2.dateAdded);
http://sqlfiddle.com/#!2/0629b2/1
但请注意,对于巨大表,这可能是巨大连接!
看看幕后: http://sqlfiddle.com/#!2/0629b2/3
如您所见,您需要 t2_dateAdded 为 null 的行。但正如您也可以看到的:与表格相比,结果已经更大了。因此,在本示例中,您创建了 6 个额外的联接结果 - 只是为了在之后将它们丢弃。 (我认为对于最多 100.000 个条目的表来说这没有问题。仍然在具有 500.000 行的服务器上运行它,并且查询在大约 2 秒内执行。)
关于mysql - 使用group by从表中获取最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26553265/