MySQL update column с последовательными номерами, сгруппированными по полю с одинаковым значением - PullRequest
0 голосов
/ 01 мая 2019

Я хотел бы сделать масштабное обновление в столбце моей таблицы MySQL, используя в качестве ссылки одно поле с таким же значением. обновление - это последовательность номеров, которая повторяется при группировании.

Версия MySQL:

5.6.41-84.1

MySQL Table:

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

Я хочу обновить столбец ierarquia_coautoria , используя столбец id_trabalho в качестве ссылки и id_auto_coautoria как ORDER BY. Ожидаемый результат примерно такой:

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 ]

2 голосов
/ 01 мая 2019

Я понимаю, что вам нужен номер строки для группы столбцов 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

примечание: я не запускал этот запрос в редакторе.

0 голосов
/ 01 мая 2019

ВАЖНО Этот ответ для MySQL 5 . MySQL 8 (или новее) имеет другие методы для получения тех же результатов.

@ Вклад BlackSwan помог мне получить ответ на мой вопрос.Спасибо!

Моя версия сервера MySQL 5.6 и не позволяет использовать функцию number_row () или процедуры CTE.Таким образом, решение было эмулировать функцию MySQL ROW_NUMBER () с подзапросом для заполнения нового столбца " sequencia ", который использовался для обновления моего нужного столбца (ierarquia_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

По порядку мы используем условие, чтобы объединить указанные столбцы и обновить нужный столбец (ierarquia_coautoria ), указав значение, хранящееся в секвенция столбец.

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

Другая информация:

ссылка на учебник по эмуляции row_number ()

ссылка на ROW_NUMBER ()функция в MySQL 8

О CTE (MySQL 8 +)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...