[英]Better way to find the latest change in sql value
我有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_id:
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数组中获取最后两个值,将它们进行比较以得出价格差异。 我的测试也有一个内部联接来返回item_name,但是为了简化问题,我删除了它。 有一个更好的方法吗? 如果可以,是否可以扩展为使用过去2或3天作为更改标准?
这就是触发器的作用,我还将讨论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' )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.