Mysql根据不同的行更新表中的行值

Posted

技术标签:

【中文标题】Mysql根据不同的行更新表中的行值【英文标题】:Mysql update row value in table based on different row 【发布时间】:2020-07-26 23:00:43 【问题描述】:

我有如下表结构

TABLE A   
    Productid    price   groupId  
     1             100      A
     2             99       A
     3              0       A
     4             50       B
     5             49       B
     6              0       B

我用来自表 B 的价格填充表 A,加入 Id。有时表 B 没有价格。 如果 b 没有价格,我想将价格更新为同一组的另一个价格,因为我的价格不能为零。

有没有办法根据组使用自身更新表价格列?例如将 productId 3 price 更新为其组中另一个产品的价格(1 或 2)

TABLE A after update  
Productid    price   groupId  
 1             100      A
 2             99       A
 3             100      A
 4             50       B
 5             49       B
 6             49       B

这似乎很愚蠢,但这些是业务规则(这很有意义,我为示例简化了问题)

当我尝试以下操作时出现错误:

    update 'Table A' t1
    join (select price ,groupId from 'table A' where Price > 0 group by 
    groupId) as t2
    on t1.groupId = t2.GroupId
    SET t1.Price = t2.Price
  
     (conn=58292) Can't reopen table: 'Table A' 

我曾想过创建第三个临时表,但这似乎......错了?我确信必须有一种方法可以使用更新语句和连接来做到这一点

【问题讨论】:

tableA 是临时表吗? 不,表 A 是永久表 【参考方案1】:

我会将查询表述为:

update tablea a
inner join (select groupId, max(price) price from tablea group by groupId) a1 
    on a1.groupId = a.groupId
set a.price = a1.price
where a.price = 0 and a1.price > 0

注意事项:

表名应该用单引号括起来(那些代表文字字符串) - 如果您的表名确实包含空格,那么使用反引号进行引用(或者更好的是,修复表名!)

我更改了子查询以使其成为有效的聚合查询 - 您的子查询具有不属于 group by 子句的非聚合列,这不是一个好的做法,并且可能会产生错误,具体取决于 SQL 模式你的数据库

在这个demo on DB Fiddlde和你的示例数据中,更新后的表格内容为:

产品ID |价格 |组 ID --------: | ----: | :------ 1 | 100 |一种 2 | 99 |一种 3 | 100 |一种 4 | 50 |乙 5 | 49 |乙 6 | 50 |乙

【讨论】:

谢谢!但我尝试并得到了类似的错误'(conn = 58516)无法重新打开表:'a'' ....可能是我的数据库引擎阻止了加入? @manicbubble:据我所知,您收到的错误表明您的表是临时表(正如我最初对您的问题所评论的那样)。你在运行 mysql 还是 MariaDB?究竟是哪个版本?

以上是关于Mysql根据不同的行更新表中的行值的主要内容,如果未能解决你的问题,请参考以下文章

基于不同表的行值对表中的列值求和

根据同一行中的行值逐行更新列值

将谷歌电子表格行值转换为不同工作表中的列

根据R中的行值合并Dataframe

可以使用表中的行值在加载时动态构建组合框吗?

如何将 crud 表中的行值传递给自定义提交按钮