更好的方法来找到sql值的最新变化

时间:2013-09-22 04:04:27

标签: php mysql sql mysqli

我有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');

然后我再次运行EACH item_id的另一个查询(这就是为什么我认为我的方法效率低下)

SELECT card_price
FROM price_table
WHERE item_id
ORDER BY change_date ASC

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

1 个答案:

答案 0 :(得分: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' )