Обновить позиции других строк в MySQL - PullRequest
0 голосов
/ 15 мая 2019

У меня есть несколько taskDetailIds против одного taskId.

Я меняю статус taskdetails при удалении taskdetails.Для этой операции я просто меняю статус с ACTIVE на DELETED.Но как только одна запись будет удалена, т. Е. Обновлена ​​в моем случае до DELETE, мне придется обновить новые позиции.

Пример: если 4-я удалена, новая позиция должна быть 1,2,3,4, 4,5,6,7,8.Точно так же, если 6-й удален, новые позиции должны быть 1,2,3,4,5,6,6,7.

Схема таблицы: taskId,taskDetailId,Status,Position

Ответы [ 2 ]

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

Считает все строки, содержащие статус = 'ACTIVE' и позицию меньше текущей позиции:

update tablename t
inner join (
  select t.*,
    (select count(*) from tablename
    where taskid = 6 and status = 'ACTIVE' and position < t.position) + 1 counter
  from tablename t
) g on g.taskid = t.taskid and g.taskDetailId = t.taskDetailId 
set t.position = g.counter
where t.taskid = 6;

См. Демоверсию .
Результаты:

| taskId | taskDetailId | Status  | Position |
| ------ | ------------ | ------- | -------- |
| 6      | 10           | ACTIVE  | 1        |
| 6      | 11           | ACTIVE  | 2        |
| 6      | 12           | ACTIVE  | 3        |
| 6      | 13           | DELETED | 4        |
| 6      | 14           | ACTIVE  | 4        |
| 6      | 15           | ACTIVE  | 5        |
| 6      | 16           | ACTIVE  | 6        |
| 6      | 17           | ACTIVE  | 7        |
| 6      | 18           | ACTIVE  | 8        |
0 голосов
/ 15 мая 2019

Просто рассчитайте позицию, когда вы выбираете данные.В MySQL 8 +:

select t.*,
       row_number() over (partition by task_id order by col3) as position
from t
where task_id = 6 and status = 'ACTIVE';
...