表中的每个项目(项目由 Serial 生成)都有很多记录,我需要获取每个项目的最后一条记录,因此我运行以下代码:
SELECT ID,Calendar,Serial,MAX(ID)
FROM store
GROUP BY Serial DESC
这意味着它必须为每个项目显示一条记录,该记录中的所有列数据都是与每个项目相关的最后一条记录,但结果如下:
-------------------------------------------------------------+
ID | Calendar | Serial | MAX(ID) |
-------------------------------------------------------------|
7031053 | 2016-05-14 14:05:14 79.5 | N10088 | 7031056 |
7053346 | 2016-05-14 15:17:28 79.8 | N10078 | 7053346 |
7051349 | 2016-05-14 15:21:29 86.1 | J20368 | 7051349 |
7059144 | 2016-05-14 15:50:27 89.6 | J20367 | 7059144 |
7045551 | 2016-05-14 15:15:15 89.2 | J20366 | 7045551 |
7056243 | 2016-05-14 15:25:34 85.2 | J20358 | 7056245 |
7042652 | 2016-05-14 15:18:33 83.9 | J20160 | 7042652 |
7039753 | 2016-05-14 11:48:16 87 | J20158 | 7039753 |
7036854 | 2016-05-14 15:18:35 87.5 | J20128 | 7036854 |
7033955 | 2016-05-14 15:20:45 83.4 | 9662 | 7033955 |
-------------------------------------------------------------+
问题是,为什么在与 Serial N10088 相关的记录中,ID 是“7031053”,但 MAX(ID) 是“7031056”?或者也适用于 J20358?
每一行必须显示每个项目的最后一条记录,但在我的输出中它不是真的!
最佳答案
如果您想要具有最大值的行,那么您需要联接或其他某种机制。
这是使用相关子查询的简单方法:
select s.*
from store s
where s.id = (
select max(s2.id)
from store s2
where s2.serial = s.serial
);
您的查询使用了 SQL Server 的一个(错误)功能,该功能会产生很多困惑并且不是特别有帮助:您在 select
中有列。不在 group by
中。这些能得到什么值(value)?
嗯,在大多数数据库中,答案很简单:查询会生成 ANSI 指定的错误。 MySQL 从不确定的匹配行中提取附加列的值。这很少不是查询作者的意图。
为了提高性能,请在 store(serial, id)
上添加索引.
关于mysql - 列出mysql中每一项的最后一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37226504/