2013-07-25 2 views
0
update moodlesocialuser 
set moodlesocialuser.deleted=deleted+1 
where id IN (
    select m1.id 
    from moodlesocialuser m1 
    join moodlesocialpost m2 on m1.id=m2.userid 
    where m2.module='blog' 
    and m1.deleted='0' 
    and url like 'http%' 
    and m1.id NOT IN (
    select id from moodlesocialcourse_display 
) 
); 

Я не могу сделать обновление и выбрать из той же таблицы.как исправить выбор и обновление к той же таблице

ОШИБКА 1093 (HY000): Вы не можете указать целевую таблицу «moodlesocialuser» для обновления в предложении FROM.

Как это сделать?

+1

Пожалуйста, не стесняйтесь форматировать запрос. –

ответ

0

сообщение об ошибке говорит, что вы пытаетесь обновить таблицу, которую вы читаете с.

Используйте временную таблицу:

create temporary table foo (id int); 

insert into foo 
    select m1.id 
    from moodlesocialuser m1 
    join moodlesocialpost m2 on m1.id=m2.userid 
    where m2.module='blog' 
    and m1.deleted='0' 
    and url like 'http%' 
    and m1.id NOT IN (
    select id from moodlesocialcourse_display 
) 
; 

update moodlesocialuser m 
inner join foo on m.id = foo.id 
set m.deleted=deleted+1 
; 

drop table foo; 
0

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

+0

Я попробовал, но возвращает ту же ошибку, спасибо, любые советы? – Martinillou

0

Похоже, вы скопировали существующий запрос в этот оператор UPDATE. Вы можете избавиться от m1 псевдонима в первом подзапроса, как это может быть:

update moodlesocialuser 
set moodlesocialuser.deleted=deleted+1 
where id IN (
    select m2.userid 
    where m2.module='blog' 
    and url like 'http%' 
) 
and moodlesocialuser.deleted='0' 
and id NOT IN (
    select id from moodlesocialcourse_display 
) 
0

Вы не можете изменить таблицу, вы выбираете из (read more here); С другой стороны, я думаю, что вы можете избавиться от этого подзапроса, как это (я не думаю, что запрос ниже будет работать, лучше проверить его на нецензурные данные, что я пытаюсь сказать - что вы могут также присоединяться к обновлению):

UPDATE moodlesocialuser mu, moodlesocialcourse_display md, moodlesocialpost mp 
SET mu.deleted=mu.deleted + 1 
WHERE 
md.id != mu.id AND 
mu.deleted = 0 AND 
mp.userid = mu.id AND 
mp.module = 'blog' AND 
mp.url LIKE 'http%' 

 Смежные вопросы

  • Нет связанных вопросов^_^