我想使用一个简单的查询来减少如下表中的值:
UPDATE `Table`
SET `foo` = `foo` - 1
WHERE `bar` IN (1, 2, 3, 4, 5)这在上面的示例中非常有用,其中IN列表只包含唯一的值,因此每个匹配行的foo列都会减少1。
问题是,当列表包含重复项时,例如:
UPDATE `Table`
SET `foo` = `foo` - 1
WHERE `bar` IN (1, 3, 3, 3, 5)在这种情况下,我希望bar是3的行减少三倍(或三倍),而1和5则减少1。
是否有一种改变行为的方法,或者可以在我可以得到所需行为的地方使用的替代查询?
我专门使用MySQL 5.7,以防有任何特定于MySQL的解决方案是有用的。
Update:我正在用脚本语言构建查询,所以可以在运行查询之前提供执行任何附加处理的解决方案(可能是伪代码,对尽可能多的人有用吗?)我不介意这样做,我只想保持查询尽可能简单,同时给出预期的结果。
发布于 2018-11-14 19:45:29
如果您可以先处理原始列表以获取计数,则可以动态构造这样的查询:
UPDATE `Table`
SET `foo` = `foo` - CASE `bar` WHEN 1 THEN 1 WHEN 3 THEN 3 WHEN 5 THEN 1 ELSE 0 END
WHERE `bar` IN (1, 3, 5)
;注意:其他的只是彻头彻尾的/偏执的;哪里应该阻止它走那么远。
发布于 2018-11-14 18:26:16
有一个例子可能对你的目的是有益的:
create table #temp (value int)
create table #mainTable (id int, mainValue int)
insert into #temp (value) values (1),(3),(3),(3),(4)
insert into #mainTable values (1,5),(2,5),(3,5),(4,5)
select value,count(*) as AddValue
into #otherTemp
from #temp t
group by value
update m
set mainValue = m.mainValue+ ot.AddValue
from #otherTemp ot
inner join #mainTable m on m.id=ot.value
select * from #mainTable发布于 2018-11-14 19:24:18
这有点棘手,但您可以通过先聚合来完成:
update table t join
(select bar, count(*) as factor
from (select 1 as bar union all select 3 as bar union all select 3 as bar union all select 3 as bar union all select 5
) b
) b
on t.bar = b.bar
t.foo = t.foo - bar.factor;https://stackoverflow.com/questions/53306361
复制相似问题