我有一个包含价格、名称、日期和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 update .php所有新数据都应该插入或更新....但旧的价值观依然存在我不太确定我应该如何处理这个....请给我一些指导或帮助
在保持数据库整洁,数据易于维护和可读的同时,最好的方法是采用@KishorSubedi在评论中所说的并创建一个日志表。
当您在产品表中更新价格时,将旧价格连同其日期和ID存储在日志表中,然后当您需要查找该产品的所有记录时,您可以在查询中加入日志表。
Log Table
| ProductID | Price | Date |
| 27 | $300 | 02.1.2013 |
| 27 | $400 | 03.1.2013 |
这样,您就可以拥有一个美观整洁的Products表,它不会被相同产品的多个产品弄得乱七八糟,并且可以轻松访问一个不引人注目的日志表。
如果您想保留旧值,我建议将它们保存在单独的表中,并使用INSERT
语句。您总是在添加新行,因此您不能绕过insert
或select into
或类似的语句。
Items
------------------------------
Id primarykey
Name
Price
------------------------------
Id primarykey autoincrement
ItemId index
AddDate index
Price
现在,当您抓取web时,您只需在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
在'item'表中为历史记录添加新列,每次价格变化都以特定格式将更改后的值附加到该列中,如date1:price1,date2:price2,....