MySQL вопрос

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
Аватара пользователя
Stanislav
Mr. Minority Report
Сообщения: 45298
Зарегистрирован: 19 окт 2005, 16:33
Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo

MySQL вопрос

Сообщение 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
Как побороть?
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Re: MySQL вопрос

Сообщение папа Карло »

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

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';
Аватара пользователя
Stanislav
Mr. Minority Report
Сообщения: 45298
Зарегистрирован: 19 окт 2005, 16:33
Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo

Re: MySQL вопрос

Сообщение Stanislav »

Минуточку!
А UPDATE не имеет параметра FROM !

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

UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]
Аватара пользователя
Mel'nik
Завсегдатай
Сообщения: 407
Зарегистрирован: 22 май 2007, 19:09
Откуда: Burnaby

Re: MySQL вопрос

Сообщение Mel'nik »

Там вроде такое было в версии 4
It is not currently possible to modify a table and select from the same table in a subquery.
скореее всего так и осталось. Сделай темп таблицу с результатами сабселекта а потом апдейть первую с сабселектом из темп.
Аватара пользователя
Stanislav
Mr. Minority Report
Сообщения: 45298
Зарегистрирован: 19 окт 2005, 16:33
Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo

Re: MySQL вопрос

Сообщение Stanislav »

Mel'nik писал(а):Там вроде такое было в версии 4
It is not currently possible to modify a table and select from the same table in a subquery.
скореее всего так и осталось. Сделай темп таблицу с результатами сабселекта а потом апдейть первую с сабселектом из темп.
Это-то понятно... Я думал есть какое-то магическое слово или можно как-то по особенному щелкнуть пальцами и все заработает... :(
Аватара пользователя
Mel'nik
Завсегдатай
Сообщения: 407
Зарегистрирован: 22 май 2007, 19:09
Откуда: Burnaby

Re: MySQL вопрос

Сообщение Mel'nik »

Ну если только магическое TEMPORARY когда делаеш таблицу :) Типа CREATE TEMPORARY bli.bla SELECT ....
badreyka
Частый Гость
Сообщения: 46
Зарегистрирован: 21 июл 2007, 22:34
Откуда: Burnaby

Re: MySQL вопрос

Сообщение 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' );
в Оракле работает
)
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Re: MySQL вопрос

Сообщение папа Карло »

ну тогда через жопу примерно вот так....

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

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