2016-10-28 7 views
0

У меня есть плоский стол, содержащий сообщения и комментарии. В настоящее время сообщения и комментарии на самом деле не связаны друг с другом, я знаю только, что комментарии находятся непосредственно перед (в терминах столбца id) их соответствующей записи.UPDATE with WHERE in sub select

Первый шаг к улучшению является создать столбец «commentforid» и заполнить его соответствующим образом:

UPDATE mytable t 
SET t.commentforid = (SELECT x.id 
         FROM mytable x 
         WHERE x.origin = 'POST' 
         AND x.id > t.id 
         LIMIT 1) 
WHERE t.origin = 'COMMENT' 

Однако запрос не с

Вы не можете указать целевую таблицу «т 'для обновления в пункте FROM

Кто-нибудь знает, в чем проблема? Я ничего не могу сделать из сообщения об ошибке.

ответ

1

Ошибка связана с тем, обновляемыми той же таблицей, вы выбираете, вы можете переопределить эту ситуацию, используя временную таблицу

Попробуйте использовать Dinamic из таблицы

сообщения
UPDATE mytable t 
    SET t.commentforid = (SELECT x.id 

         FROM (select z.id from mytable z 
         WHERE x.origin = 'POST') x on x.id > t.id 
         LIMIT 1) 
    WHERE t.origin = 'COMMENT' 
+0

Спасибо, это сработало! –

+0

@ D.R. weel если мой ответ правильно, то отметьте его как принято. – scaisEdge

+0

Существует минимальное количество минут, которые вы должны подождать, прежде чем сможете это сделать. –

1

Ошибки вполне понятно. Он говорит вам, что вы не можете получить новое значение из той же таблицы, которую вы обновляете.

Почему?

Представьте, что (даже как ошибка) вы пытаетесь обновить поле в записи, используя одно и то же значение записи и поля. Это имеет смысл для вас?

+0

Благодарим вас за разъяснение основной проблемы, @scaisEdge предоставила обходное решение. –

+0

Альтернативный подход будет (и я предпочитаю, так как он упрощает чтение и понимание кода): получите новое значение для поля в одном выражении select (это будет внутренний выбор), а затем пользователь полученное значение в операторе обновления (ваш внешний выбор). Да, я знаю, некоторые люди не согласятся, но один из золотых правил в Software Engineering (к сожалению, забытый или неизвестный многими) - это ** вы не пишете код для вас, а для других, которым может потребоваться его прочитать и понять Это**. – FDavidov