在WHERE…IN中启用重复项?

时间:2018-11-14 18:07:55

标签: mysql sql

我想使用一个简单的查询来减少像这样的表中的值:

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)

在这种情况下,我希望将bar3的行减3倍(或减3),并将15减1的行。 1。

是否可以更改行为,或者可以在可以获取所需行为的地方使用替代查询?

如果有任何特定于MySQL的变通办法,我会特别使用MySQL 5.7。

更新:我正在以脚本语言构建查询,因此随时提供在运行查询之前执行任何其他处理的解决方案(可能是伪代码,以便对越多越好?)。我不介意这样做,我只是想在提供预期结果的同时使查询尽可能简单。

3 个答案:

答案 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;