获取每个 ID 的最后一条记录
Posted
技术标签:
【中文标题】获取每个 ID 的最后一条记录【英文标题】:Get last record of each ID 【发布时间】:2020-10-01 00:02:56 【问题描述】:我有这个问题:
SELECT Truck.Name AS name,
timestamp,
oil,
diesel,
cargo,
Truck.notes AS Remarks
FROM trip
INNER JOIN Truck USING (idTruck)
WHERE idTruck IN('2','4','5','6','7','8','9','11','12','13','14','15','16')
ORDER BY name, timestamp DESC
从 ID 中返回所有记录 我正在考虑使用 CURDATE 作为
AND DATE(timestamp) = CURDATE()
为了获得最后的记录,但是当一天没有修改记录时(他们通常这样做,但 有时情况并非如此)我失去了记录。无论单个查询中的时间戳如何,我如何修改查询以获取每个 idTruck 的最后一个条目?
【问题讨论】:
见meta.***.com/questions/333952/… dev.mysql.com/doc/refman/8.0/en/… 这是一个有效的 sql 小提琴:sqlfiddle.com/#!9/820325/1 【参考方案1】:建议你使用sql的MAX函数获取最后一条记录(MAX(Truck.Name)):
SELECT MAX(Truck.Name) AS name,
timestamp,
oil,
diesel,
cargo,
Truck.notes AS Remarks
FROM trip
INNER JOIN Truck USING (idTruck)
WHERE idTruck IN('2','4','5','6','7','8','9','11','12','13','14','15','16')
ORDER BY name, timestamp DESC
获取每个ID的最后一条记录:
SELECT MAX(Truck.Name) AS name,
timestamp,
oil,
diesel,
cargo,
Truck.notes AS Remarks
FROM trip
INNER JOIN Truck USING (idTruck)
WHERE idTruck IN('2','4','5','6','7','8','9','11','12','13','14','15','16')
GROUP BY idTruck
ORDER BY name, timestamp DESC
因为根据sql.sh(https://sql.sh/fonctions/agregation/max):
聚合函数 MAX() 允许返回 a 的最大值 记录集中的列。该函数可以应用于数字或 字母数字数据。例如,可以搜索最 网上商店桌子上的昂贵产品。
【讨论】:
这只会带回一个 idTruck 而不是表中每个 idTruck 的最后一个。如果可能,我想在单个查询中获取 where 子句中所有 id 的最后一个条目。 那么您只需要像这样添加 GROUP BY idTruck :SELECT idTruck, MAX(Truck.Name) AS name,timestamp, oil, diesel, cargo, Truck.notes AS Remarks FROM trip INNER JOIN Truck USING (idTruck) WHERE idTruck IN('2','4','5','6','7','8','9','11','12','13','14','15','16') GROUP BY idTruck ORDER BY name, timestamp DESC
。等待。如果可以,我会更改答案。
我接受了你的回答,但我稍作改动:我输入了 MAX(timestamp) 和瞧:
投反对票,因为它不起作用。 GROUP BY
加上 MAX
将正确获取每个组的“最后一个”值,但它不会获取对应于该最大值的其余列。然后,您必须 JOIN
返回表以获取对应于最大值的其他列。请参阅我添加的[groupwise-maximum]
标签。
@Dadinaks - 很抱歉对新手很苛刻。您关于MAX()
的cmets 很好。但总体答案是一个常见的错误;我不能让它成为被接受和赞成的答案。以上是关于获取每个 ID 的最后一条记录的主要内容,如果未能解决你的问题,请参考以下文章