Как обновить группу записей с инкрементными значениями - PullRequest
1 голос
/ 21 ноября 2010

У меня есть таблица со столбцами "step_ID", "goal_ID" и "step_number".

step_ID будет первичным ключом с автоинкрементом
goal_ID группирует различные шаги в конкретные цели
step_number в настоящее время везде 0, недавно созданный

Я хочу ОБНОВИТЬ таблицу так, чтобы step_number был установлен в 0, 1, 2, 3 и т. Д. Для каждой группы схожих "goal_ID", упорядоченных по step_ID.

Говоря по-другому, я бы хотел нумеровать шаги для данной цели от 0 до скольких целей в порядке возрастания step_ID.

Я попробовал очевидное:

$ query = "UPDATE steps SET SET step_num = step_num + 1 WHERE goal_ID = '689' ORDER BY step_ID";

но это просто устанавливает все строки в 1 (как и ожидалось.)

Я также пытался использовать различные подзапросы, но получил сообщение об ошибке, сказав, что не могу обновить таблицу, использованную в предложении FROM.

Мысли

Ответы [ 2 ]

2 голосов
/ 21 ноября 2010

Попробуйте разбить запрос на 2 и использовать mysql определяемые пользователем переменные

как

$db->query("SET @counter:=-1");
$db->query(UPDATE steps SET step_num = @counter:=@counter+1 WHERE goal_ID='689' ORDER BY step_ID");
1 голос
/ 22 ноября 2010
Update steps
Set step_num =  (
                    Select Count(*)
                    From steps As T1
                    Where T1.goal_ID = steps.goal_ID
                        And T1.step_ID < steps.step_ID
                    )

EDIT

Похоже, вы столкнулись с ошибкой в ​​MySQL в отношении запросов на обновление, которые содержат коррелированные подзапросы. Выше будет стандартизированная версия. Вы можете обойти ограничение в MySQL следующим образом:

Update steps
Set step_num =  (
                    Select Count(*)
                    From    (
                            Select T1.step_Id, T1.goal_Id
                            From steps As T1
                            ) As Z
                    Where Z.goal_Id = steps.goal_ID
                        And Z.step_ID < steps.step_ID
                    )

Другое решение:

Update steps As T1
    Join    (
            Select T1.step_ID, Count(T2.step_ID) As step_num
            From steps As T1
                Left Join steps As T2
                    On T2.goal_ID = T1.goal_ID
                        And T2.step_ID < T1.step_ID
            Group By T1.step_ID
            ) As T3
        On T3.step_ID = T1.step_ID
Set step_num = T2.step_num
...