给出了包含购买数据的下表.

CREATE TABLE myTable (
 id INT NOT NULL AUTO_INCREMENT,
 date DATETIME NOT NULL,
 subNo SMALLINT NOT NULL,
 poNo INT NOT NULL,
 PRIMARY KEY (id))

INSERT INTO myTable VALUES (0, '2022-11-01 12:43', 1, 800), (0, '2022-11-02 13:00', 1, 800), (0, '2022-11-03 12:43', 2, 800), (0, '2022-11-03 14:00', 1, 923), (0, '2022-11-03 15:00', 2, 800), (0, '2022-11-04 12:43', 1, 800)
 Id |      Date        | SubNo | PO# |
----|------------------|-------|-----|
100 | 2022-11-01 12:43 |   1   | 800 |
101 | 2022-11-02 13:00 |   1   | 800 |
102 | 2022-11-03 12:43 |   2   | 800 |
103 | 2022-11-03 14:00 |   1   | 923 |
104 | 2022-11-03 15:00 |   2   | 800 |
105 | 2022-11-04 12:43 |   1   | 800 |

SubNo是采购的子集或部分数量(PO编号)的序号.一次购买可以有30多个子集.

我正在寻找为给定采购的每个子集提供最新日期的查询.
对于PO 800,它将如下所示:

 Id |       Date       | SubNo | PO# |
----|------------------|-------|-----|
105 | 2022-11-04 12:43 |   1   | 800 |
104 | 2022-11-03 15:00 |   2   | 800 |

我还没有找到过滤最新日期的方法. 粗略的做法是

SELECT id, date, subNo
FROM myTable
WHERE poNo=800
GROUP BY subNo
ORDER BY subNo, date DESC

但DISTINCT和GROUP BY不保证返回最新日期.

然后,我try 先创建一个视图,以便在以后的查询中使用.

CREATE VIEW myView AS
SELECT subNo s, (SELECT MAX(date) FROM myTable WHERE poNo=800 AND subNo=s) AS dd
FROM myTable
WHERE poNo=800
GROUP BY s

但是,尽管查询是OK的,但当用于视图时,结果不同,这可能是由于视图限制.

最后,我try 了一个联接表

SELECT id, datum, subNo s
FROM myTable my JOIN (SELECT MAX(date) AS d FROM myTable WHERE poNo=800 AND subNo=s) tmp ON my.date=tmp.d
WHERE poNo=800

但在WHERE子句中收到错误"UNKNOWN COLUMN"%s".

我的MySQL版本是8.0.22

推荐答案

您可以判断(date,subno)是否与(Max(Date),subno)对之一对应:

SELECT id, date, subno
FROM mytable
WHERE pono = 800 AND (date, subno) IN (
    SELECT MAX(date), subno
    FROM mytable
    WHERE pono = 800
    GROUP BY subno
)
GROUP BY subno;

我在一张干净的桌子上得到的结果是:

+----+---------------------+-------+
| id | date                | subno |
+----+---------------------+-------+
|  6 | 2022-11-04 12:43:00 |     1 |
|  5 | 2022-11-03 15:00:00 |     2 |
+----+---------------------+-------+

根据您希望如何管理具有相同subno的最大多行,您可能希望按subno删除最后一个组.有了它,它只显示了其中的一个.否则,它将显示所有复制的最大行数.

Mysql相关问答推荐

在Join的ON分句中使用SUM()

MySQL没有使用S隐式附加到此二级索引的主键

数组上的MySQL、JSON_CONTAINS用法

如何合并有多行的json列

PythonAnywhere中SSH到MySQL数据库无限期挂起,SSH正确,workbench可以完美连接

如何用sql找出两次之间的差异

按相关表中的计数和特定值过滤

如何将多个字符串插入变量

如何更新一个巨大的表的 50k 行?

如何根据购买的商品数量查找 unique_ids 的数量

创建 mySQL BEFORE/AFTER UPDATE 触发器

访问 nodejs、mysql 和 json 中的嵌套对象数组

在 Presto Athena 中将字符串转换为数组

如何在 Mysql 中创建复合外键

MySQL使用多列 Select 重复记录

如何在 MySQL 中 Select 字段具有最小值的数据?

不是唯一的表/别名

在 Mac 上设置 Laravel php artisan migrate 错误:没有这样的文件或目录

在osx的命令行中使用Mysql-找不到命令?

在 PHP 中运行 MySQL *.sql 文件