SQL ...更新产品价格但保留以前的值

时间:2013-06-07 13:12:10

标签: php sqlite

我的桌子上摆满了各种产品,包括价格,名称,日期和ID(PK)

我需要在价格变化时更新记录(Web抓取脚本),我将如何处理这个以便不插入新行,而是更新价格和日期.....但以前的值需要保留在DB ....所以当我去的时候

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

想要输出:

$400  12.4.2013
$314  22.4.2013
$250  12.4.2013

随着第一个价格的下载,产品将显示所有更新的值,实际上它将是该项目价格的历史记录...

我希望实现的实际结果希望是

“产品27”的历史是:

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

3 个答案:

答案 0 :(得分:2)

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

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

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

通过这种方式,您可以拥有一个漂亮而整洁的Products表,它不会混杂使用同一产品的多个产品,并且可以轻松访问一个不显眼的日志表。

希望这能为您提供构建站点和数据库的一些指导。

答案 1 :(得分:0)

在'item'表格中为历史记录添加新列,每次价格更改都会将更改后的值附加到此列,其格式类似于date1:​​price1,date2:price2,....

答案 2 :(得分: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