2013-09-22 31 views
2

我有2個表格,其中一個列出項目,另一個跟蹤項目價格變化的時間。更好的方式來找到sql值的最新變化

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返回(這個i所以我覺得我的方法是無效的)

SELECT card_price 
FROM price_table 
WHERE item_id 
ORDER BY change_date ASC 

而且從PHP數組拿到最後兩個值,比較它們以獲得價格上的差異。我的測試有一個內部聯接來返回item_name,但我已經刪除了它來簡化問題。有一個更好的方法嗎?如果是這樣,它可以擴展到最後2或3天作爲更改標準嗎?

+0

可能重複[mysql:在GROUP BY中使用LIMIT獲得每個組的N個結果?](http://stackoverflow.com/questions/2129693/mysql-using-limit-within-group-by-to-get- n-results-per-group) – Barmar

回答

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') 
+0

如果我在原表(price_table)上使用「INSERT IGNORE」並且失敗由於唯一性而更新? – Tom

相關問題