PHP / MySQL检测表中的价格列变化

时间:2018-02-18 12:06:11

标签: php mysql triggers

最好的方法是什么?

我的表,Listings

+------------------+--------+-------+--------+
|      Title       | ItemID |  SKU  | Price  |
+------------------+--------+-------+--------+
| Product Title #1 |  02439 | AE-SM | 100.00 |
| Product Title #2 |  04923 | BX-MM | 200.00 |
+------------------+--------+-------+--------+

此信息每天通过PHP脚本cron作业从电子商务平台API获取一次。

Shopify是一个简单的例子,因为可以从json编码的URL获取列表数据

//connect to mysql database

$connect = new mysqli($server, $username, $password, $database);

$connect->query('TRUNCATE ShopifyListings;');

$shopifylistings = file_get_contents('https://secret:key@my-store.myshopify.com/admin/products.json');

$productsjson = json_decode($productsfile, true);

foreach($productsjson['products'] as $products) {

// decode variables to insert

$sql = "INSERT INTO Listings (Title, ItemID, SKU, Price)
VALUES ('".$title."', '".$itemid."', '".$sku."', '".$price."')";

}

我的任务是跟踪列表中的价格变化。

我的第一个初步假设是创建一个新表Listings_history

+----+------------------+-----+-----------+-----------+
| id | Item_Identifier  | SKU | old_Price | new_Price |
+----+------------------+-----+-----------+-----------+

然后创建一个触发器,例如

DELIMITER $$ 
CREATE TRIGGER 'pricing_History' AFTER INSERT ON 'Listings' 
FOR EACH ROW 
BEGIN
  IF (NEW.Price <> OLD.Price) THEN
      INSERT INTO Listings_history (Item_identifier, SKU, old_Price, new_Price) VALUES(ItemID, Title, OLD.Price, NEW.Price);
  END IF
END;
$$

但当然这不起作用,因为我在插入新值之前使用TRUNCATE语句删除表的内容,因此无法获得OLD.Price

我有什么选择?我想我可以创建一个PHP脚本,它使用SELECT语句并引用Listings中的当前行,然后使用UPDATE语句在需要时更新行,并使用DELETE语句如果行/产品未列出(这样我可以使用上面的触发器)

创建像上面这样的TRIGGER最好的方法吗?如果是这样,我是否必须修改如何将数据从Listings语句输入INSERT表到UPDATE语句?

或者是否有更好的更有效的方法来跟踪价格变化?

1 个答案:

答案 0 :(得分:0)

加载表后,使用如下查询计算所有价格变化:

select l.ItemID, l.Title, ph.new_Price, l.Price
from listings l left join
     (select ph.*
      from pricing_history ph
      where ph.id = (select max(ph2.id)
                     from price_history ph2
                     where ph2.item_identifier = ph.item_identifier
                    )
     ) ph
     on l.item_identifier = ph.item_identifier
where ph.new_Price is null or ph.new_price <> l.price;

您可以在此之前添加insert并将所有内容一次性插入。

注意:我希望历史记录表中有日期/时间。

编辑:

对于性能,price_history(item_identifier, id)上的索引会有所帮助。

类似的解决方案不是使用价格历史记录,而是将shopifylistings复制到last_shopifylistings并使用它代替price_history。然后不需要用于获得最近价格变化的子查询。