gpt4 book ai didi

php - 在 PHP 中比较两个 SQL 表

转载 作者:行者123 更新时间:2023-11-30 23:16:14 24 4
gpt4 key购买 nike

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

  • 我需要知道今天数据中没有的所有产品昨天(可以通过供应商 SKU 检查)
  • 我需要知道昨天数据中没有的所有产品在今天更长
  • 我需要知道昨天的数据价格是什么时候上涨的
  • 我需要知道价格何时比昨天的数据下降
  • 我需要根据昨天的数据知道销售何时开始,因为以及停止

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

正常上定期下来杂项更改(描述更改或对非优先字段的更改)促销(供应商提供的折扣)promo off(供应商取消的折扣)删除(新列表中没有产品记录{可能已被删除})新项目(新列表中产品的新记录)缺货我一直在到处寻找这些问题的答案,并找到了一些东西,这些东西向我展示了如何使用 union 和 join 来做到这一点,但我不完全理解如何根据这种情况使用它们。

我尝试了不同的 PHP 解决方案,方法是遍历每条数据并在新表中搜索 sku,反之亦然,然后检查两个表中是否存在任何更改,但这需要很长时间,我有这些表格中有超过 200,000 种产品。我希望通过让 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)");
}
}

编辑:以下是所有数据将进入的真实表格。我本来不想用大 table 搅浑水,但应要求我把它包括在内。

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 编写函数、触发器等更简单。

编辑:只需编写一个简单的函数

我现在正在处理它。考虑像这样使用 select case 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

关于php - 在 PHP 中比较两个 SQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17692327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com