比较PHP中的两个SQL表

时间:2013-07-17 06:09:03

标签: php mysql

我每天都会创建一个SQL表,该表从供应商网站下载,其中包含csv中的产品信息。我创造的一切都很好,所有的桌子都是一样的。我需要解决的问题是我需要比较今天和昨天之间的表格(表格名称是以下格式mm-dd-yyyy的日期)我需要比较几个不同的列以用于不同的事情。

  • 我需要知道当前数据中没有的所有产品 昨天(可由供应商SKU检查)
  • 我需要知道昨天的数据中没有的所有产品 今天更长的
  • 我需要知道价格何时从昨天的数据上升
  • 我需要知道价格何时从昨天的数据中下降
  • 根据昨天的数据,我需要知道什么时候开始销售 好了,停止了

这些需要在表格中显示以下标签,以显示更改

定期上去 经常下来 错误的更改(描述更改或更改为不优先的字段) 促销(从供应商处添加折扣) 促销关闭(供应商取消折扣) 删除(没有新列表中的产品记录{可能已被删除}) 新项目(新列表中的新产品记录) 缺货 我一直在寻找这些问题的答案,并找到了一些东西,告诉我如何使用union和join这样做,但我不完全理解如何根据这种情况使用它们。

我尝试了不同的PHP解决方案,遍历每个数据并在新表中搜索sku,反之亦然,然后检查是否存在两个表中的任何更改,但这需要很长时间,而且我有这些表格中有超过20万种产品。我希望我可以在更少的查询中执行这些操作,并让sql server更多地工作,然后使用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

1 个答案:

答案 0 :(得分:0)

由于数据库的大小,我可以为您提供SQL解决方案。

当您使用大量数据时,PHP可能会因为某些原因而变慢。

你可以尝试做一些功能。

您只需将状态数据存储在另一个表中即可。这是编写触发器的文档。

http://dev.mysql.com/doc/refman/5.0/en/triggers.html

如果你的桌子上有很多操作,我可以建议你使用PostgresSQL而不是mysql,因为我发现使用PL/sql

编写函数,触发器......更简单 编辑:只需编写一个简单的函数

我正在研究它。考虑使用像answer

这样的选择案例

编辑:核心功能

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 cache