首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在…中启用副本在……里面?

在…中启用副本在……里面?
EN

Stack Overflow用户
提问于 2018-11-14 18:07:54
回答 3查看 86关注 0票数 3

我想使用一个简单的查询来减少如下表中的值:

代码语言:javascript
复制
UPDATE `Table`
SET `foo` = `foo` - 1
WHERE `bar` IN (1, 2, 3, 4, 5)

这在上面的示例中非常有用,其中IN列表只包含唯一的值,因此每个匹配行的foo列都会减少1。

问题是,当列表包含重复项时,例如:

代码语言:javascript
复制
UPDATE `Table`
SET `foo` = `foo` - 1
WHERE `bar` IN (1, 3, 3, 3, 5)

在这种情况下,我希望bar3的行减少三倍(或三倍),而15则减少1。

是否有一种改变行为的方法,或者可以在我可以得到所需行为的地方使用的替代查询?

我专门使用MySQL 5.7,以防有任何特定于MySQL的解决方案是有用的。

Update:我正在用脚本语言构建查询,所以可以在运行查询之前提供执行任何附加处理的解决方案(可能是伪代码,对尽可能多的人有用吗?)我不介意这样做,我只想保持查询尽可能简单,同时给出预期的结果。

EN

回答 3

Stack Overflow用户

发布于 2018-11-14 19:45:29

如果您可以先处理原始列表以获取计数,则可以动态构造这样的查询:

代码语言:javascript
复制
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)
;

注意:其他的只是彻头彻尾的/偏执的;哪里应该阻止它走那么远。

票数 2
EN

Stack Overflow用户

发布于 2018-11-14 18:26:16

有一个例子可能对你的目的是有益的:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2018-11-14 19:24:18

这有点棘手,但您可以通过先聚合来完成:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53306361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档