MySql,插入重复更新在哪里

时间:2016-07-28 16:55:42

标签: php mysql database insert sql-update

我有一个表(price_flow)有3列。我用来记录产品的价格流:

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表中插入一个新行(如果它是新的一天)或更新行(如果那个日期产品价格已经记录)。所以我在重复更新时使用了#34;插入" query(table在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)."

我该如何解决这个问题?感谢

1 个答案:

答案 0 :(得分:2)

你有两个 let permissions = ["email", "public_profile", "user_friends"] PFFacebookUtils.linkUserInBackground(currentUser.parseUser,withReadPermissions: permissions,block:{(succeeded: Bool, error: NSError? ) in if error != nil { print ("error in call to linkuser") return } if succeeded { print ("succeed to linkuser") self.linkWithFaceBookBtn.setTitle("Unlink your Account from Facebook", forState: .Normal) } else { print ("did not succedd to linkuser or user cancelled") } }) 条款,这是一个语法错误。如果您需要在where中有条件地更新该字段,请执行以下操作:

on dupe key