Как выбрать ту же таблицу в операторе обновления с MySQL - PullRequest
0 голосов
/ 03 ноября 2011

В этой таблице есть столбец с именем 'position'.Этот столбец отсчитывает от 0. (Первая строка имеет позицию 0, вторая имеет 1 и т. Д.)

Теперь, если строка с позицией 4 перемещается вверх, я хочу установить строку выше (строка с позицией 3) в текущую позицию.(Таким образом, позиция 3 становится позицией 4.)

Так, например:

У меня есть:

id = 12, position = 2
id = 11, position = 3
id = 9, position = 4
id = 8, position = 5

После обновления я хочу:

id = 12, position = 2
id = 11, position = 4
id = 9, position = 3
id = 8, position = 5

Я хочу использовать идентификатор строки, чтобы обновить позицию.

Это то, что у меня есть, но это не работает на MySQL:

UPDATE message
SET position = position + 1
WHERE position = (SELECT position - 1 FROM message WHERE id = 11);

КогдаЯ пытаюсь запустить его, он выдает мне эту ошибку: «Ошибка SQL (1093): вы не можете указать целевую таблицу« message »для обновления в предложении FROM».

Как я могу это исправить?

Ответы [ 3 ]

2 голосов
/ 03 ноября 2011

РЕДАКТИРОВАТЬ - после ОБНОВЛЕНИЯ с образцами данных из OP:

Я предполагаю, что вы знаете идентификатор (= 11) и хотите, чтобы данные изменились, как показано в вашем обновленном вопросе ... вам нужно обновить 2 строки, чтобы добиться этого:

UPDATE message m SET
m.position = (CASE WHEN m.id = 11 THEN m.position + 1 ELSE m.position - 1 END)
WHERE m.id = 11 OR m.id =
(SELECT z.li FROM (SELECT MAX (l.id) li FROM message h INNER JOIN message l ON h.position = (l.position - 1) WHERE h.id = 11) z);
0 голосов
/ 03 ноября 2011

Думаю, нам нужно выполнить это до конца (кажется, я понял идею, но поправьте меня, если нет):

Рассмотрим две строки:

Перед изменением строки

ID=10, Position=3
ID=11, Position=4

Идем ID = 11 вверх:

ID=10, Position=3
ID=11, Position=3

Нам нужно

ID=10, Position=4
ID=11, Position=3

Поэтому обновление должно быть:

UPDATE message
SET position = position + 1
WHERE position = (SELECT position FROM (select id, position from message) WHERE id = 11)
    and id<>11
0 голосов
/ 03 ноября 2011

Добавьте ORDER BY position DESC к запросу, чтобы выполнить его снизу вверх и не допускать, чтобы одна и та же позиция была дважды в одно и то же время.

Редактировать: я опубликовал это до того, как ОП сказал, в чем его ошибка - я только что догадался.

На сегодняшний день самое простое решение - просто получить позицию в родительском коде, а не в MySQL.

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