查找sql​​值最新变化的更好方法

Posted

技术标签:

【中文标题】查找sql​​值最新变化的更好方法【英文标题】:Better way to find the latest change in sql value 【发布时间】:2013-09-22 04:04:26 【问题描述】:

我有 2 张表,其中一张列出商品,另一张记录商品价格何时发生变化。

 price_table:
 price_id int
 item_id int
 price_amount float
 change_date date // this date is stored as Y-m-d, without a time

 item_table:
 item_id int
 item_name char(40)
 item_description char(40)

我知道以下发现item_ids在当前日期发生了变化:

 SELECT item_id
 FROM price_table
 WHERE change_date = "$today"

什么时候

 $today = date('Y-m-d');

然后我对返回的每个 item_id 运行另一个查询(这就是我认为我的方法效率低下的原因)

SELECT card_price
FROM price_table
WHERE item_id
ORDER BY change_date ASC

并从 php 数组中获取最后 2 个值,比较它们以获得价格差异。我的测试也有一个内部连接来返回 item_name,但我已经删除了它以简化问题。有一个更好的方法吗?如果是这样,是否可以将其扩展为使用过去 2 或 3 天作为更改标准?

【问题讨论】:

mysql: Using LIMIT within GROUP BY to get N results per group?的可能重复 【参考方案1】:

这就是触发器的作用,我还要讲DATE_SUB和日期间隔

使用触发器可以让您将当前价格保存在价格表中,并将历史价格保存在单独的表中。

例如,考虑创建一个名为 price_table_old 的新表

price_table_old:
price_id int  
item_id int
price_amount float
change_date date

在 price_table 上,创建一个“更新”触发器...

insert into price_table_old ( `item_id`,  `price_amount` ,  `change_date ` )  
VALUES  ( OLD.`item_id` , OLD.`price_amount` , NOW() )

为了帮助您了解触发器语法,我复制了下面用于人员表的触发器

当有人更改价格时,price_table_old 表会自动更新。

从这里开始,获取当前价格和之前价格的比较会更符合逻辑。

您可以运行类似...的查询。

SELECT 
    price_table.item_id , 
    price_table.price_amount , 
    (price_table.price_amount - price_table_old.price_amount ) AS pricediff , 
    price_table_old.change_date 
FROM 
    price_table
LEFT JOIN 
    price_table_old ON price_table_old.item_id = price_table.item_id 
ORDER BY price_table.item_id , price_table_old.change_date DESC

或在其中粘贴特定项目和/或日期范围和/或限制以获得最后(例如)3 次价格变化的区域。

例如,要获取过去 3 天所有商品的价格变化列表,您可以使用这样的语句

SELECT 
    price_table.item_id , 
    price_table.price_amount , 
    (price_table.price_amount - price_table_old.price_amount ) AS pricediff , 
    price_table_old.change_date 
FROM 
    price_table
LEFT JOIN 
    price_table_old ON price_table_old.item_id = price_table.item_id 
WHERE 
    price_table_old.change_date > ( DATE_SUB( NOW() , INTERVAL 3 DAY )) 
ORDER BY price_table.item_id , price_table_old.change_date DESC

这是我的员工表触发器...

CREATE TRIGGER `Staff-CopyOnUpdate` BEFORE UPDATE ON `staff` 
FOR EACH ROW insert into staff_old  
( `sid` , `title`,  `firstname` ,  `surname`  , `type`, 
    `email` , `notify`, `actiondate`, `action` )
VALUES  
( OLD.`sid` , OLD.`title`,  OLD.`firstname` ,  OLD.`surname`  , OLD.`type`,
    OLD.`email` , OLD.`notify`, NOW() , 'updated' ) 

【讨论】:

如果我在原始表(price_table)上使用“INSERT IGNORE”并且由于唯一性而无法更新,触发器是否仍然会发生?

以上是关于查找sql​​值最新变化的更好方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 .NET 在目录中查找最新文件且不循环?

DB2 SQL 比 SUM+CASE 更好的方法来获取基于 ID 的唯一值计数

根据 SQL Server 中的最新日期创建具有过滤值的新视图的最佳方法是啥?

将值计算从 SQL 移到 PHP 层会更好吗?

ASP.NET 是不是有更好的方法来查找其他控件中的控件?

SQL查询带有条件的最新值