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

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

最佳答案

你可以简单地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/

相关文章:

MySQL:在一个表中查找另一个表中包含特定日期的每一行的最新行

mysql - SQL - 查询性能

MySQL 错误 : Cannot add foreign key constraint?

php - 计数总是返回 1...但它存在吗?

php - (PHP) OOP 设计 - 概括方法

php - 在 PHP 中从字符串创建唯一整数

mysql - 如何在不知道最大数据大小的情况下存储和索引非常大的文本项

mysql - 数据库查询选择所有列,包括每条记录的计数 'group by'

sql - 单数还是复数数据库表名?

mysql - 格式字符和字符串插值的 Django 原始 SQL 查询问题