我每天都会创建一个SQL表,该表是从供应商网站下载的,包含产品信息,即csv
。我把所有的东西都做好了,所有的表都是一样的。我需要解决的问题是,我需要比较今天和昨天的表(表名是以下格式mm-dd-yyyy
的日期)。我需要比较不同事物的几个不同列。
- 我需要了解今天数据中所有未包含的产品昨天(可以通过供应商SKU进行检查)
- 我需要知道昨天数据中的所有产品在今天的
- 我需要知道价格从昨天的数据来看是什么时候上涨的
- 我需要知道价格从昨天的数据来看什么时候下跌了
- 根据昨天的数据,我需要知道何时开始销售以及停止
这些需要在表中显示以下标签,以显示的变化
常规上行常规羽绒错误更改(描述更改或对非优先级字段的更改)促销(从供应商处添加折扣)促销(供应商取消折扣)删除(新列表中没有产品记录{可能已删除})新项目(新列表中产品的新记录)缺货我一直在到处寻找这些问题的答案,并找到了一些东西,向我展示了如何使用联合和加入来做到这一点,但我不完全理解如何在这种情况下使用它们。
我尝试过不同的PHP解决方案,通过浏览每一条数据,在新表中搜索sku,反之亦然,然后检查两个表中是否存在任何更改,但这需要很长时间,我在这些表中有超过20万个产品。我希望我可以在更少的查询中完成这些操作,并让sql服务器比php脚本做更多的工作。
谢谢你的帮助!
昨天的表
__________________________________________________________
| id | price | sale | description | qty | sku |
---------------------------------------------------------
| 1 | 12.50 | 0.00 | description product 1 | 12 | 12345 |
| 2 | 22.99 | 20.99 | describe the problem | 1 | 54321 |
| 3 | 192.99 | 0.00 | description ftw | 5 | 53421 |
| 4 | 543.52 | 0.00 | description | 15 | 45121 |
----------------------------------------------------------
今天的表
__________________________________________________________
| id | price | sale | description | qty | sku |
---------------------------------------------------------
| 1 | 12.50 | 0.00 | description product 1 | 12 | 12345 |
| 2 | 22.99 | 0.00 | describe the problem | 1 | 54321 |
| 3 | 192.99 | 50.00 | description ftw | 5 | 53421 |
| 4 | 523.99 | 0.00 | description | 15 | 45123 |
----------------------------------------------------------
我需要新的表格看起来像下面的
_____________________________________________________________
| id | sku | label | description | price |
-------------------------------------------------------------
| 1 | 54321 | promo off | describe the problem | 22.99 |
| 2 | 53421 | promo on | description ftw | 192.99|
| 3 | 45123 | new item | description | 523.99|
| 4 | 45121 | delete | description | 543.52|
-------------------------------------------------------------
以下是我当前已删除项目和新项目的代码。在下面的例子中,我使用int作为标签/状态,只是表示不同的数字。
$deleted = mysql_query("SELECT * FROM `test1`") or die(mysql_error());
while($skus= mysql_fetch_array($deleted))
{
$query = mysql_num_rows(mysql_query("SELECT * FROM `test2` WHERE SKU='".$skus['sku']."'"));
if($query < 1)
{
$tata= mysql_query("INSERT INTO `gday` (Contract_Price, SKU, status) VALUES (".$skus['price'].", ".$skus['sku'].", 1)");
}
}
$deleted = mysql_query("SELECT * FROM `test2`") or die(mysql_error());
while($skus= mysql_fetch_array($deleted))
{
$query = mysql_num_rows(mysql_query("SELECT * FROM `test1` WHERE SKU='".$skus['sku']."'"));
if($query < 1)
{
$tata= mysql_query("INSERT INTO `gday` (Contract_Price, SKU, status) VALUES (".$skus['price'].", ".$skus['sku'].", 2)");
}
}
编辑:以下是所有数据将进入的真实表格。我本来不想用大桌子把水搅浑,但应要求我已经把它包括在内了
ID
Status
DiscountDate
Price
Discount
DiscountEndDate
Desc1
Desc2
Desc3
Warranty
Qty1
Qty2
PricingUnit
PriceUpdate
Vendor
Category
UPC
Weight
WeightUnit
由于数据库的大小,我可以向您推荐一个SQL解决方案。
当您处理大量数据时,PHP可能会因为以下几个原因而速度较慢。
你可以试着做一些功能。
您只需要将状态数据存储在另一个表中即可。这是编写触发器的文档。
http://dev.mysql.com/doc/refman/5.0/en/triggers.html
如果你的表上有很多操作,我可以建议你使用PostgresSQL而不是mysql,因为我发现写函数、触发器。。。使用PL/sql
编辑:只需编写一个简单的函数
我现在正在做这件事。考虑在这个答案中使用选择案例
EDIT:核心功能
DELIMITER |
CREATE PROCEDURE export()
BEGIN
(SELECT today.id, today.sku,
CASE today.price
WHEN today.price = yesterday.price THEN 'nothing'
WHEN today.price < yesterday.price THEN 'promo on'
ELSE 'promo off' END AS label
FROM today, yesterday WHERE yesterday.sku = today.sku)
UNION
(
SELECT today.id, today.sku,
'new item' AS label
FROM today LEFT JOIN yesterday ON yesterday.sku = today.sku WHERE yesterday.sku IS NULL)
UNION
(
SELECT yesterday.id, yesterday.sku,
'delete' AS label
FROM yesterday LEFT JOIN today ON today.sku = yesterday.sku WHERE today.sku IS NULL
);
END|
DELIMITER ;
打电话只需做:
CALL export();
以下是一个可能的核心功能示例。在这种情况下要小心,id可能是一样的。在函数中,您必须在第一列中添加一个个人函数。
如果您需要性能来在PHP中更快地显示它,请考虑APC缓存