MySQL 如何在搜索查询中的链接 table 中获取第二条最新记录
MySQL how to get 2nd most recent record in linked table in search query
我有一个 MySQL 数据库,其中包含两个链接的 table 产品和价格历史记录。它们由 productID 字段链接。每次产品价格发生变化时,我都会创建一个新的历史记录。产品的最新历史记录具有最新价格。我还将当前价格存储在产品 table 中。我想要 运行 一份报告,我可以在其中检索第二个最后的价格历史记录,以便我可以比较当前价格和最后一个价格。我尝试了下面的 sql 查询,returns 最新的价格历史记录,即当前价格。我怎样才能得到第二个最近的价格历史记录?对于较新的记录,historyID 会更高,因为它是自动增量,并且价格历史更新时间对于较新的记录也会更近,因此这可能是一种排序方式。谢谢!
SELECT
product.code, product.currentPrice, priceHistory.price,
product.url, product.manuID, product.lastSeenTime,
priceHistory.updateTime, product.dateAdded,
priceHistory.historyID
FROM product, priceHistory
WHERE product.idProduct = priceHistory.productID
GROUP BY priceHistory.productID
HAVING count(*) > 1
ORDER BY `product`.`lastSeenTime` DESC
您可以使用 ROW_NUMBER()
window 函数根据任何动态顺序为行分配编号。一旦你这样做了,你就可以简单地按那个数字过滤。
例如:
with
h as (
select *,
row_number() over(partition by productid order by updatetime desc) as rn
from pricehistory
)
select
p.code,
p.currentprice,
h.price,
p.url,
p.manuid,
p.lastseentime,
h.updatetime,
p.dateadded,
h.historyid
from product p
left join h on h.productid = p.productid and h.rn = 2
编辑:
如果您不能使用 CTE,则可以使用 table 表达式重写查询,如:
select
p.code,
p.currentprice,
h.price,
p.url,
p.manuid,
p.lastseentime,
h.updatetime,
p.dateadded,
h.historyid
from product p
left join (
select *,
row_number() over(partition by productid order by updatetime desc) as rn
from pricehistory
) h on h.productid = p.productid and h.rn = 2
我有一个 MySQL 数据库,其中包含两个链接的 table 产品和价格历史记录。它们由 productID 字段链接。每次产品价格发生变化时,我都会创建一个新的历史记录。产品的最新历史记录具有最新价格。我还将当前价格存储在产品 table 中。我想要 运行 一份报告,我可以在其中检索第二个最后的价格历史记录,以便我可以比较当前价格和最后一个价格。我尝试了下面的 sql 查询,returns 最新的价格历史记录,即当前价格。我怎样才能得到第二个最近的价格历史记录?对于较新的记录,historyID 会更高,因为它是自动增量,并且价格历史更新时间对于较新的记录也会更近,因此这可能是一种排序方式。谢谢!
SELECT
product.code, product.currentPrice, priceHistory.price,
product.url, product.manuID, product.lastSeenTime,
priceHistory.updateTime, product.dateAdded,
priceHistory.historyID
FROM product, priceHistory
WHERE product.idProduct = priceHistory.productID
GROUP BY priceHistory.productID
HAVING count(*) > 1
ORDER BY `product`.`lastSeenTime` DESC
您可以使用 ROW_NUMBER()
window 函数根据任何动态顺序为行分配编号。一旦你这样做了,你就可以简单地按那个数字过滤。
例如:
with
h as (
select *,
row_number() over(partition by productid order by updatetime desc) as rn
from pricehistory
)
select
p.code,
p.currentprice,
h.price,
p.url,
p.manuid,
p.lastseentime,
h.updatetime,
p.dateadded,
h.historyid
from product p
left join h on h.productid = p.productid and h.rn = 2
编辑:
如果您不能使用 CTE,则可以使用 table 表达式重写查询,如:
select
p.code,
p.currentprice,
h.price,
p.url,
p.manuid,
p.lastseentime,
h.updatetime,
p.dateadded,
h.historyid
from product p
left join (
select *,
row_number() over(partition by productid order by updatetime desc) as rn
from pricehistory
) h on h.productid = p.productid and h.rn = 2