我想使用一个简单的查询来减少像这样的表中的值:
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
的行减3倍(或减3),并将1
和5
减1的行。 1。
是否可以更改行为,或者可以在可以获取所需行为的地方使用替代查询?
如果有任何特定于MySQL的变通办法,我会特别使用MySQL 5.7。
更新:我正在以脚本语言构建查询,因此随时提供在运行查询之前执行任何其他处理的解决方案(可能是伪代码,以便对越多越好?)。我不介意这样做,我只是想在提供预期结果的同时使查询尽可能简单。
答案 0 :(得分:1)
如果您可以先处理原始列表以获取计数,则可以动态构造这种查询:
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)
;
注意:ELSE只是彻底/偏执;在哪里应该防止它走得那么远。
答案 1 :(得分:0)
有一个示例可能对您有用:
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
答案 2 :(得分:0)
这有点棘手,但是您可以先进行汇总:
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;