更新 WHERE IN() mysql
Posted
技术标签:
【中文标题】更新 WHERE IN() mysql【英文标题】:UPDATE WHERE IN() mysql 【发布时间】:2018-05-16 00:35:00 【问题描述】:
我有一个名为 tableA 的表,其中包含两列 1,2。我试图从第 1 列中删除一个值,具体取决于数组中的内容。如果该值存在两次,我想将 col1 设置为col1 = col1 - 2
。
如果WHERE IN ()
没有忽略数组上的重复值,我可以使用UPDATE tableA SET col1 = col1 - 1 WHERE col2 IN (?); .. [arr]
并继续前进。
我还要注意,这与主键或唯一键无关,重复值没有问题。下面是 X 是我需要修复的地方的查询。
UPDATE tableA SET col1 = col1 - X WHERE col2 IN (?); .. [arr]
我知道我可以循环查找 arr 并运行一个简单的查询,例如:UPDATE tableA SET col1 = col1 - 1 WHERE col2 = ? ; .. [arr[i]]
每次但我试图找到更好的方法 - 如果有的话。
【问题讨论】:
【参考方案1】:你可以使用UPDATE ... JOIN
:
UPDATE tableA a
JOIN (SELECT id, COUNT(*) cnt
FROM (SELECT 1 AS id UNION ALL SELECT 1 UNION ALL SELECT 1
UNION ALL SELECT 2 UNION ALL SELECT 2) x -- here goes IN values
GROUP BY id
)s
ON a.col2 = s.id
SET a.col1 = a.col1 - cnt;
DBFiddle Demo
【讨论】:
我在理解这行SELECT 1 AS id UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 2)
时遇到了一些麻烦,您介意解释一下吗。
@JohnJames 重点是代替IN (1,2,3)
=> (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 3
在最终查询中,您根本不使用IN
。这就是我的方法的重点。
哦,好的,我明白了,谢谢。不幸的是,我在执行 FROM IN (?)
, ... [arr] where arr = [1,1,2]; 时遇到错误我是不是误会了什么?
@JohnJames 正如我所说,您根本不使用 IN。 您需要在应用层 (ORM) 中重写它以生成 UNION ALL
。以上是关于更新 WHERE IN() mysql的主要内容,如果未能解决你的问题,请参考以下文章