Страница 1 из 1

MySQL вопрос

Добавлено: 01 окт 2009, 11:59
Stanislav
Есть у меня таблица. В таблице есть поле "идентификатор списка рассылки - list_id". Я его хочу поменять для некоторых записей таблицы.
Эти некоторые записи я вычисляю с помощью подзапроса. Короче, должно работать вот так:

Код: Выделить всё

UPDATE newsletter.clients_lists cl SET cl.`list_id` = 54
WHERE cl.`id` IN ( SELECT c.`id`
FROM newsletter.clients_lists c INNER JOIN newsletter.snd_users s
ON c.`client_id` = s.`id`
WHERE c.`list_id` = 53 AND s.`email1` like '%yahoo.ca' );
MySQL выпендривается - говорит, нельзя делать FROM и UPDATE одновременно:
You can't specify target table 'cl' for update in FROM clause
Как побороть?

Re: MySQL вопрос

Добавлено: 01 окт 2009, 13:02
папа Карло

Код: Выделить всё

update c
set
 `list_id` = 54
from
 newsletter.clients_lists c INNER JOIN newsletter.snd_users s ON c.`client_id` = s.`id`
WHERE c.`list_id` = 53 AND s.`email1` like '%yahoo.ca';
вот так не работает? или вот так:

Код: Выделить всё

update newsletter.clients_lists
set
 `list_id` = 54
from
 newsletter.clients_lists c INNER JOIN newsletter.snd_users s ON c.`client_id` = s.`id`
WHERE c.`list_id` = 53 AND s.`email1` like '%yahoo.ca';

Re: MySQL вопрос

Добавлено: 01 окт 2009, 13:06
Stanislav
Минуточку!
А UPDATE не имеет параметра FROM !

Код: Выделить всё

UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

Re: MySQL вопрос

Добавлено: 01 окт 2009, 13:45
Mel'nik
Там вроде такое было в версии 4
It is not currently possible to modify a table and select from the same table in a subquery.
скореее всего так и осталось. Сделай темп таблицу с результатами сабселекта а потом апдейть первую с сабселектом из темп.

Re: MySQL вопрос

Добавлено: 01 окт 2009, 13:47
Stanislav
Mel'nik писал(а):Там вроде такое было в версии 4
It is not currently possible to modify a table and select from the same table in a subquery.
скореее всего так и осталось. Сделай темп таблицу с результатами сабселекта а потом апдейть первую с сабселектом из темп.
Это-то понятно... Я думал есть какое-то магическое слово или можно как-то по особенному щелкнуть пальцами и все заработает... :(

Re: MySQL вопрос

Добавлено: 01 окт 2009, 14:39
Mel'nik
Ну если только магическое TEMPORARY когда делаеш таблицу :) Типа CREATE TEMPORARY bli.bla SELECT ....

Re: MySQL вопрос

Добавлено: 01 окт 2009, 17:07
badreyka
попробуи так

Код: Выделить всё

UPDATE newsletter.clients_lists cl 
SET cl.`list_id` = 54
WHERE c1.`list_id` = 53 
      AND EXISTS (SELECT 1 FROM newsletter.snd_users s
                   WHERE  c1.`client_id` = s.`id`
                          AND s.`email1` like '%yahoo.ca' );
в Оракле работает
)

Re: MySQL вопрос

Добавлено: 01 окт 2009, 17:28
папа Карло
ну тогда через жопу примерно вот так....

Код: Выделить всё

update mytable set mycol = myval where myid in (select whateverid from tab1 t1 join tab2 t2 on t1.asdf = t2.adaa where ....);
такое работает?