我表中的每个项目(项目由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?
每一行必须显示每个项目的最后一条记录,但在我的输出中却不是这样!
答案 0 :(得分:1)
如果您希望行具有最大值,则需要连接或其他一些机制。
以下是使用相关子查询的简单方法:
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
中。这些有什么价值?
好吧,在大多数数据库中,答案很简单:查询会生成ANSI指定的错误。 MySQL从不确定的匹配行中提取其他列的值。这很少是查询的作者想要的。
为了提高性能,请在store(serial, id)
上添加索引。
答案 1 :(得分:1)
尝试这个。
SELECT MAX(id), tbl.*
FROM store tbl
GROUP BY Serial
答案 2 :(得分:0)
你也可以试试这个......
SELECT ID,Calendar,Serial
FROM store s0
where ID = (
SELECT MAX(id)
FROM store s1
WHERE s1.serial = s0.serial
);