Mysql通过删除差异更新列
Posted
技术标签:
【中文标题】Mysql通过删除差异更新列【英文标题】:Mysql update a column with removing differences 【发布时间】:2020-12-23 16:57:36 【问题描述】:我不知道如何用语言来解释。所以请让我举个例子。
假设 items 表按order
列排序:
| id | name | order |
| 5 | x | 1 |
| 2 | y | 3 |
| 3 | z | 4 |
| 7 | p | 8 |
我想更新order
列,使它们中的每一个都与它们的连续行有 1 个差异,同时保持顺序。
期望的结果:
| id | name | order |
| 5 | x | 1 |
| 2 | y | 2 |
| 3 | z | 3 |
| 7 | p | 4 |
编辑: 选择 row_number() 不是我的解决方案,因为我想更改订单,而且我不只是在寻找行号。
【问题讨论】:
你为什么不使用'AUTO_INCREMENT'?我想这就是你需要的。 @thebrownkid 因为如果任何行被删除,我就会失去安排。我想弥补差距。 @thebrownkid 因为在特殊情况下,我在页码 x 中。前端向我发送了一组带有页码的项目。例如第 2 页的数组 (1,2,3,4,5,6,7,8,9,10) 是项目的 ID。我想订购它们。偏移量是 10。所以我使用这些值 (11,12,13,14,15,16,17,18,19,20) 设置订单,但如果我的订单列有间隙,则无法订购它们。 【参考方案1】:在 mysql8 中,只需使用row_number()
:
select t.*,
row_number() over(order by ord) as new_ord
from mytable t
这表明可以在需要时轻松地即时计算信息,并导致发现存储此类派生信息可能不是一个好主意。在添加或删除新行时保持更新是很乏味的。
相反,你可以使用上面的查询,或者把它放在一个视图中:
create view myview as
select t.*,
row_number() over(order by ord) as new_ord
from mytable t
注意:order
是语言关键字,我用 ord
代替。
如果您确实需要update
,例如一次性任务:
update mytable t
inner join (
select id, row_number() over(order by ord) as new_ord from mytable
) t1 on t1.id = t.id
set t.ord = t1.new_ord
【讨论】:
【参考方案2】:我建议将视图用于其他答案中也提到的此类要求。
如果这是一次性活动并且每条记录的顺序都是唯一的,那么您可以使用以下使用相关子查询的查询。
Update your_table t
Set t.order = (select count(1)
From your_table tt where tt.order <= t.order);
【讨论】:
MySQL 不支持update
语句中的这种“自相关”子查询。自己看:dbfiddle.uk/….以上是关于Mysql通过删除差异更新列的主要内容,如果未能解决你的问题,请参考以下文章