2

価格、名前、日付、ID (PK) を含む製品でいっぱいのテーブルがあります。

価格が変更されたときにレコードを更新する必要があります (Web スクレイピング スクリプト)。価格と日付が更新されるのではなく、新しい行が挿入されないようにするにはどうすればよいでしょうか。値はDBに残る必要があります....そのため、私が行くとき

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

必要な出力:

$400  12.4.2013
$314  22.4.2013
$250  12.4.2013

製品は、最初の価格がダウンロードされてから更新されたすべての値とともに表示され、事実上、アイテムの価格の履歴になります...

私が達成したい実際の結果はうまくいけば

「Product 27」の履歴は次のとおりです。

より多くのコンテキストを提供するために、スクリプトを実行すると... ./script.php更新すべての新しいデータを挿入または更新する必要があります....しかし、古い値は残ったままで、これにどのようにアプローチすべきかわかりません....お願いしますいくつかのガイダンスまたは支援を提供してください

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

「item」テーブルに履歴用の新しい列を追加し、価格が変更されるたびに、日付 1:価格 1、日付 2:価格 2、....のような特定の形式で変更された値をこの列に追加します。

于 2013-06-07T13:25:09.560 に答える
0

古い値を保持したい場合は、それらを別のテーブルに保存し、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
于 2013-06-07T13:26:35.327 に答える