Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL如何在搜索查询中获取链接表中的第二条最新记录_Mysql_Sql_Mariadb 10.1 - Fatal编程技术网

MySQL如何在搜索查询中获取链接表中的第二条最新记录

MySQL如何在搜索查询中获取链接表中的第二条最新记录,mysql,sql,mariadb-10.1,Mysql,Sql,Mariadb 10.1,我有一个MySQL数据库,有两个链接表,分别是产品和价格历史记录。它们由productID字段链接。每次产品价格发生变化时,我都会创建一个新的历史记录。产品的最新历史记录具有最新价格。我还将当前价格存储在产品表中。我想运行一个报告,在那里我可以检索第二个上次价格历史记录,以便比较当前和上次价格。我尝试了下面的sql查询,它返回最新的价格历史记录,即当前价格。如何获取第二个最新的价格历史记录?对于较新的记录,historyID会更高,因为它是自动递增的,而对于较新的记录,price history

我有一个MySQL数据库,有两个链接表,分别是产品和价格历史记录。它们由productID字段链接。每次产品价格发生变化时,我都会创建一个新的历史记录。产品的最新历史记录具有最新价格。我还将当前价格存储在产品表中。我想运行一个报告,在那里我可以检索第二个上次价格历史记录,以便比较当前和上次价格。我尝试了下面的sql查询,它返回最新的价格历史记录,即当前价格。如何获取第二个最新的价格历史记录?对于较新的记录,historyID会更高,因为它是自动递增的,而对于较新的记录,price history updateTime也会更晚,因此这可能是一种排序方法。谢谢

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(行编号)窗口功能,根据任何动态排序为行指定编号。一旦你这样做了,你就可以简单地按这个数字过滤

例如:

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,则可以使用表表达式重写查询,如中所示:

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

谢谢你的回答。我使用的是MariaDB 10.1,它似乎不支持“with”。有没有其他方法可以达到同样的效果?我将升级到10.2,它支持“with”,一旦我测试过,它不会破坏任何东西。添加了不使用CTE的额外解决方案。谢谢,当我运行非CTE代码时,我得到了错误。1248-每个派生表都必须有自己的别名。在那里的某个地方应该有另一个as吗?忘记了最后一行的h。修正了,谢谢你的刺客!这将返回我要查找的结果:-