MySQL更新列,其序列号由具有相同值的字段分组

时间:2019-05-01 05:44:07

标签: mysql sql

我想使用一个具有相同值的字段作为参考在MySQL表的列中进行大规模更新。 更新是分组时重复的数字序列。

MySQL版本:

  

5.6.41-84.1

MySQL表:

  

sis_coautoria

列和值

id_auto_coautoria | id_coautor | hierarquia_coautoria | id_trabalho

1, 1, null, 123
2, 43, null, 123
3, 2, null, 123
4, 2, null, 100
5, 1, null, 675
6, 50, null, 100

我想使用 id_trabalho 列作为参考,并 id_auto_coautoria 作为ORDER BY更新 hierarquia_coautoria 列。预期的结果是这样的:

id_auto_coautoria | id_coautor | hierarquia_coautoria | id_trabalho

1, 1, 1, 123
2, 43, 2, 123
3, 2, 3, 123
4, 2, 1, 100
6, 50, 2, 100
5, 1, 1, 675

id_trabalho = 123的行用 1、2、3 更新; id_trabalho = 100用 1、2 等更新。


*如果需要,还有另一个表以 id_trabalho列作为参考。

其他MySQL表

sis_trabalhos

id_auto_trabalho | id_trabalho

1, 123
2, 100
3, 675

因此,我尝试了以下操作:

SET @rank:=0;
UPDATE sis_coautoria
INNER JOIN sis_trabalhos ON sis_coautoria.id_trabalho = sis_trabalhos.id_trabalho
SET sis_coautoria.hierarquia_coautoria=@rank:=@rank+1; 

结果:

id_auto_coautoria | id_coautor | hierarquia_coautoria | id_trabalho

1, 1, 1, 123
2, 43, 2, 123
3, 2, 3, 123
4, 2, 4, 100
5, 1, 5, 675
6, 50, 6, 100
...

结果是一个数字序列,忽略了id_trabalho条件,使其具有相同的值。


PS ::如何显示具有这种友好视图的MySQL表enter image description here

2 个答案:

答案 0 :(得分:2)

据我了解,您需要一组id_trabalho列的行号。由于Mysql 5没有CTE,因此您可以使用子查询来执行相同的操作。

    update sis_coautoria a
join 
(SELECT 
    @row_number:=CASE
        WHEN @id_trabalho = id_trabalho THEN @row_number + 1
        ELSE 1
    END AS rn,
    @id_trabalho:=id_trabalho as id_trabalho,
    id_auto_coautoria
FROM
    sis_coautoria
ORDER BY id_auto_coautoria)
cte on a.id_auto_coautoria=cte.id_auto_coautoria
set a.hierarquia_coautoria=cte.rn

注意:我尚未在编辑器上运行此查询。

答案 1 :(得分:0)

重要 该答案适用于 MySQL 5 MySQL 8(或更高版本)还有其他获得相同结果的方法。

@BlackSwan的贡献帮助我获得了我的问题的答案。谢谢!

我的 MySQL服务器版本为5.6 ,并且不允许number_row()函数或CTE过程。因此,解决方案是使用子查询模拟MySQL ROW_NUMBER()函数,以填充新列“ sequencia ”,该列用于更新所需的列( hierarquia_coautoria )。

此处是获得所需结果的代码:

update sis_coautoria a
join 
(SELECT 
    @row_number:=CASE
        WHEN @trabalhoID = id_trabalho THEN @row_number + 1
        ELSE 1
    END AS sequencia,
    @trabalhoID:=id_trabalho as trabalho_id,
    id_coautor_auto,
    id_usuario
FROM
    sis_coautoria,(SELECT @trabalhoID:=0,@row_number:=0) as t
ORDER BY id_trabalho ASC)
cte on a.id_coautor_auto=cte.id_coautor_auto
set a.hierarquia_coautoria=cte.sequencia

代码说明:

在这种情况下,我们使用变量(@row_number)存储行的计数编号:当 trabalho_id 具有相同的值时,将在中以数字顺序方式添加新的行号。 sequencia 列。

@row_number:=CASE
            WHEN @trabalhoID = id_trabalho THEN @row_number + 1
            ELSE 1
        END AS sequencia

依次,我们使用条件连接被引用的列,并使用存储在 sequencia 列中的值来更新所需的列( hierarquia_coautoria )。

cte on a.id_coautor_auto=cte.id_coautor_auto
    set a.hierarquia_coautoria=cte.sequencia 

其他信息:

链接到row_number() emulation tutorial

链接到ROW_NUMBER() function in MySQL 8

About CTE (MySQL 8+)