mysql - 在 WHERE … IN 中启用重复项?

标签 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 的行递减三倍(或递减三),并且 15 减 1。

有没有办法改变行为,或者我可以使用替代查询来获得所需的行为?

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

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

最佳答案

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

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 只是彻底/偏执; WHERE 应该阻止它走那么远。

关于mysql - 在 WHERE … IN 中启用重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53306361/

相关文章:

mysql - Mysql自动更新2表或多表

mysql - 如何提高我的投票系统的性能?

sql - 如何使用 R 从 SQL 数据库中检索很长的 XML 字符串?

php - SQL 按日期和时间排序不起作用

mysql - IIS 上的 ASP Classic 需要 31 秒来执行每个 mySQL 脚本

MySQL SELECT 与多个表

sql - 将 varchar 数据类型转换为 datetime 数据类型导致值超出范围

C# 如何将 DataGridView 列标题显示到文本框中?

php - Laravel OrderBy 关系计数

mysql - 如何提高嵌套集模型中数千个插入的速度?