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根据不同的行更新表中的行值的主要内容,如果未能解决你的问题,请参考以下文章