2016-07-28 75 views
0

我有一個表(price_flow),它有3列。我用它來記錄產品的價格流:MySql,插入重複更新,其中

row_id (int, primary, ai) | product_id (int) | price (int) | update_date (date) 
1       | 1234    | 302   | 2016-07-22 
2       | 923    | 153   | 2016-07-25 
3       | 1234    | 290   | 2016-07-28 
4       | 923    | 170   | 2016-07-28 
5       | 1111    | 111   | 2016-07-28 
... 

基本上,當PHP腳本搜索的產品價格運行,在結束它在MySQL表中插入新行(如果它是新的一天)或更新行(如果該日期產品價格已經被記錄)。所以我使用了「插入重複更新」查詢(表在product_id x update_date上有唯一索引)。我的查詢是:

$aid = 1234; //Model ID 
$date = date('Y-m-d'); //Current date 
$pmin = 210; //Price 
$query = "INSERT INTO price_flow (model_id, update_date, price) 
VALUES($aid, '$date', $pmin) ON DUPLICATE KEY 
UPDATE price=$pmin"; 

它工作正常,但我想現在要做的是隻有在價格一致與同一產品的其他價格更新/插入價格(由腳本發現結果並不總是準確)。所以我認爲價格永遠不會低於前一個價格的一半。所以我用

$query = "INSERT INTO price_flow (model_id, update_date, price) 
SELECT $aid, $date, $pmin FROM price_flow WHERE model_id=$aid AND price<".(2*$pmin)." 
ORDER BY date DESC LIMIT 1 ON DUPLICATE KEY 
UPDATE price=291 WHERE price <".(2*$pmin).";" 

因此,如果插入目前爲止,股價不低於兩倍的新價格(因此,新的價格小於或等於最後價格的一半),但這並沒有插入或更新新價錢。 有兩個問題:1)查詢語法是錯誤的:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE price <420' at line 1 

2)如果是以前沒有記錄的新產品,新生產線沒有插入(因爲這個SELECT $aid, $date, $pmin FROM price_flow WHERE model_id=$aid AND price<".(2*$pmin)."

如何我可以解決這個感謝

+0

**警告**:此代碼可能有一些嚴重的[SQL注入漏洞](http://bobby-tables.com/)。儘可能使用**準備好的陳述**。這些在['mysqli'](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)和[PDO](http://php.net/manual/)中很簡單en/pdo.prepared-statements.php)其中任何用戶提供的數據都是用'?'或':name'指示符指定的,後者使用'bind_param'或'execute'填充,具體取決於您使用的是哪一個。 – tadman

回答

2

你有兩個where條款,這是平出一個語法錯誤,如果你需要更新一個字段有條件在on dupe key,然後像這樣做:?

... UPDATE price=IF(price < 2*$pmin, 291, price) 
+0

非常感謝,這解決了我的第一個問題,第二個解決方案? –

+0

不知道。可能不應該嘗試混合這兩種類型的查詢。對於這樣的選擇,mysql無法真正創建行。雖然你可以嘗試一個聯盟,但總是會運行,無論主選擇的結果如何。 –