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通过删除差异更新列的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询:OraclemysqlHQL查询语句差异

MySQL SUM 两列之间差异的值

MySql 和Server Sql的差异

MySQL如何对比两个表数据的异同

计算MySQL和PHP中的日期差异

获得 2 个 mySQL 表差异的更简单方法?