我的桌子上摆满了各种产品,包括价格,名称,日期和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更新 应插入或更新所有新数据....但旧值仍然存在 我不太清楚我应该如何处理这个....请给我一些指导或帮助
答案 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
语句。您总是添加新行,因此您无法绕过insert
或select 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