【问题标题】:MySql, insert on duplicate update whereMySql,在重复更新时插入
【发布时间】:2016-07-28 16:55:41
【问题描述】:

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

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&lt;".(2*$pmin)."

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

【问题讨论】:

  • 警告:此代码可能有多个严重的SQL injection bugs。尽可能使用准备好的语句。在mysqliPDO 中执行这些操作非常简单,其中任何用户提供的数据都使用?:name 指示符指定,稍后使用bind_paramexecute 填充,具体取决于您是哪个使用。

标签: php mysql database insert sql-update


【解决方案1】:

您有两个 where 子句,这完全是语法错误。如果您需要在on dupe key 中有条件地更新该字段,请执行以下操作:

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

【讨论】:

  • 非常感谢,这解决了我的第一个问题,第二个问题有什么解决方案吗?
  • 不知道。可能不应该尝试混合两种类型的查询。对于这样的选择,mysql 不能真正无中生有地创建行。虽然您可以尝试联合,但无论主选择的结果如何,它总是会运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多