2

2 つのテーブルがあり、1 つはアイテムをリストし、もう 1 つはアイテムの価格がいつ変更されたかを追跡します。

 price_table:
 price_id int
 item_id int
 price_amount float
 change_date date // this date is stored as Y-m-d, without a time

 item_table:
 item_id int
 item_name char(40)
 item_description char(40)

以下は、現在の日付で変更された item_ids を見つけることを知っています:

 SELECT item_id
 FROM price_table
 WHERE change_date = "$today"

いつ

 $today = date('Y-m-d');

次に、返された各 item_id に対して別のクエリを実行します (これが、私の方法が非効率的だと思う理由です)

SELECT card_price
FROM price_table
WHERE item_id
ORDER BY change_date ASC

そして、PHP 配列から最後の 2 つの値を取得し、それらを比較して価格の差を取得します。私のテストには item_name を返すための内部結合もありましたが、質問を単純化するためにそれを削除しました。これを行うより良い方法はありますか?もしそうなら、代わりに変更基準として過去 2、3 日間を使用するように拡張できますか?

4

1 に答える 1

1

これがトリガーの目的です。DATE_SUB と日付間隔についても説明します。

トリガーを使用すると、現在の価格を価格テーブルに保持し、過去の価格を別のテーブルに保持できます。

たとえば、price_table_old という名前の新しいテーブルを作成することを検討してください。

price_table_old:
price_id int  
item_id int
price_amount float
change_date date

price_table で、「更新」トリガーを作成します...

insert into price_table_old ( `item_id`,  `price_amount` ,  `change_date ` )  
VALUES  ( OLD.`item_id` , OLD.`price_amount` , NOW() )

トリガーの構文を理解するために、スタッフ テーブルに使用したトリガーを以下にコピーしました。

誰かが価格を変更すると、price_table_old テーブルが自動的に更新されます。

ここから、現在の価格と以前の価格との比較を取得することは、もう少し論理的です。

次のようなクエリを実行できます....

SELECT 
    price_table.item_id , 
    price_table.price_amount , 
    (price_table.price_amount - price_table_old.price_amount ) AS pricediff , 
    price_table_old.change_date 
FROM 
    price_table
LEFT JOIN 
    price_table_old ON price_table_old.item_id = price_table.item_id 
ORDER BY price_table.item_id , price_table_old.change_date DESC

または、特定のアイテムおよび/または日付範囲および/または最後の (たとえば) 3 つの価格変更を取得するための制限にゾーンインする場所を貼り付けます。

たとえば、すべてのアイテムの過去 3 日間の価格変更のリストを取得するには、次のようなステートメントを使用できます。

SELECT 
    price_table.item_id , 
    price_table.price_amount , 
    (price_table.price_amount - price_table_old.price_amount ) AS pricediff , 
    price_table_old.change_date 
FROM 
    price_table
LEFT JOIN 
    price_table_old ON price_table_old.item_id = price_table.item_id 
WHERE 
    price_table_old.change_date > ( DATE_SUB( NOW() , INTERVAL 3 DAY )) 
ORDER BY price_table.item_id , price_table_old.change_date DESC

これが私のスタッフテーブルのトリガーです...

CREATE TRIGGER `Staff-CopyOnUpdate` BEFORE UPDATE ON `staff` 
FOR EACH ROW insert into staff_old  
( `sid` , `title`,  `firstname` ,  `surname`  , `type`, 
    `email` , `notify`, `actiondate`, `action` )
VALUES  
( OLD.`sid` , OLD.`title`,  OLD.`firstname` ,  OLD.`surname`  , OLD.`type`,
    OLD.`email` , OLD.`notify`, NOW() , 'updated' ) 
于 2013-09-22T04:42:02.740 に答える