2

我有一张桌子,里面全是产品,包括价格、名称、日期和 ID(PK)

当价格发生变化时,我需要更新记录(网络抓取脚本),我将如何处理以便不插入新行,而是更新价格和日期.....但是之前值需要保留在数据库中......所以当我去的时候

"SELECT * FROM items WHERE id ='27'";

想要的输出:

$400  12.4.2013
$314  22.4.2013
$250  12.4.2013

然后,该产品将显示自下载第一个价格以来的所有更新值,实际上它将是该项目的价格历史...

我希望达到的实际结果是

“产品 27”的历史是:

为了提供更多上下文,当我运行我的脚本时... ./script.php update 应该插入或更新所有新数据....但是旧值仍然不确定我应该如何处理这个....请给我一些指导或帮助

4

3 回答 3

2

在保持整洁的数据库以及易于维护和可读数据的同时解决此问题的最佳方法是采用@KishorSubedi 在评论中所说的内容并创建一个日志表。

当您在产品表中更新价格时,将旧价格及其日期和 ID 存储在日志表中,然后当您需要查找该产品的所有记录时,您可以在查询中加入日志表。

Log Table
| ProductID | Price | Date      |
| 27        | $300  | 02.1.2013 |
| 27        | $400  | 03.1.2013 |

通过这种方式,您可以拥有一个漂亮而整洁的 Products 表,不会因为多个相同的产品而杂乱无章,还可以拥有一个易于访问的不显眼的日志表。

希望这能给您一些有关构建站点和数据库的指导。

于 2013-06-07T13:29:19.500 回答
0

在“项目”表中为历史添加新列,每次价格更改都将更改后的值附加到此列,并具有特定格式,例如 date1:price1,date2:price2,....

于 2013-06-07T13:25:09.560 回答
0

如果您想保留旧值,我建议将它们保存在单独的表中并使用该INSERT语句。您总是在添加新行,因此您无法绕过insertselect into或类似的语句。

表结构:

Items
------------------------------
Id          primarykey
Name

Price
------------------------------
Id          primarykey autoincrement
ItemId      index
AddDate     index
Price

现在,当您抓取网络时,您只需在Price表格中插入新价格。如果您想选择一个项目的所有价格,您可以使用

SELECT  Items.Id
       ,Items.Name
       ,Price.Price
       ,Price.AddDate
FROM Items
LEFT JOIN Price
ON Items.Id=Price.ItemId
WHERE Items.Id='27'
ORDER BY Items.Name ASC, Price.AddDate ASC

如果您只想要最新或当前的价格,您可以使用

SELECT  Items.Id
       ,Items.Name
       ,P1.Price
       ,P1.AddDate
FROM Items
LEFT JOIN Price P1
ON Items.Id=Price.ItemId
LEFT JOIN Price P2
ON P1.ItemId=P2.ItemId
AND P1.Id<P2.Id

WHERE Items.Id='27'
AND P2.Id IS NULL
于 2013-06-07T13:26:35.327 回答