使用group by从表中获取最新记录

时间:2014-10-24 17:35:56

标签: mysql

我有一张表格,显示订单号,订单说明以及它们的放置日期。

有时会重复订单号。我希望获得所有带有描述的唯一订单号,但只显示重复的最新订单

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的第一个,如何让它选择最新的?

3 个答案:

答案 0 :(得分:2)

您可以简单地LEFT JOIN自己的表格on orderID 添加加入条件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 为空的行。但是您也可以看到:与表格相比,结果已经更大了。所以在这个例子中你创建了6个额外的连接结果 - 只是为了之后扔掉它们。 (对于我认为超过100.000个条目的表,没有问题。仍然在具有500.000行的服务器上运行它,并且查询在~2秒内执行。)

答案 1 :(得分:0)

尝试使用MAX()函数

SELECT orderID,orderInfo,MAX(dateAdded) from (
  SELECT orderID,orderInfo,dateAdded from orders   ORDER BY dateAdded DESC) as t
   group by orderID

答案 2 :(得分:-1)

正如你所说,你想要最新的,所以你可以使用:

select * from orders group by orderID order by dateAdded desc