Бредовый глюк в майскл : update на основе подзапроса

12
[Удален]
1122

есть такой запрос


SELECT `keys`.`id`
FROM `query` , `keys` , `orders`
WHERE t1.id = `keys`.`id` `pos` >0
AND `pos` <10
AND `keys`.`key` = `query`.`key`
AND `keys`.`oid` = `orders`.`id`
AND `orders`.`url` = `query`.`url`

Возвращает список идишников в таблице `keys`, для которых надо поле `state` поменять с 0 на 1. Что еще там есть в keys это неважно. Сам запрос работает, сделать его проще нельзя (необходимо линковать три таблицы по любому).

Соответственно как такой запрос прилепить к апдейту?

при попытке сделать вот так


Update `keys` SET `state`='1' WHERE `id` IN (подзапрос)

Скрипт (phpmyadmin и собственный) виснет наглухо.

Версия mysql 4.1, посему WHERE EXISTS (подзапрос) возвращает ошибку

Спасибо всем откликнувшимся

АПД:

В предложенном мной варианте с update после легких ухищрений виса не возникает


UPDATE `keys` SET `state` = '1' WHERE `id` IN (
SELECT `t1`.`id`
FROM `query` , `keys` `t1` , `orders`
WHERE `pos` >0
AND `pos` <10
AND `t1`.`key` = `query`.`key`
AND `t1`.`oid` = `orders`.`id`
AND `orders`.`url` = `query`.`url`
)

Но пишет ошибку мол нельзя использовать `keys` для обновления ибо стоит он во FROM

N
На сайте с 06.05.2007
Offline
419
#1

"виснет наглухо" - это не диагностика, а ваше восприятие ошибки.

Диагностикой мог бы являться номер ошибки или точное время выполнения запроса.

Замерьте сколько времени работает чистый Select в скобках. для начала.

netwind добавил 18.03.2009 в 16:59

4.1 это печально.

попробуйте как там пишут в комментариях http://dev.mysql.com/doc/refman/4.1/en/update.html :

update t1 , (select id ,max(recno) as recno from t1 where id=8 group by recno) tt

set t1.c1 = 'NO'

where tt.id=t1.id and

t1.recno=tt.recno

группировка хоть и бессмысленна, но она должна имитировать в 4.1 временную таблицу.

Кнопка вызова админа ()
[Удален]
#2

Вот не надо тут ставить под сомнение мое восприятие. Наглухо значит наглухо. Поясняю :

Нет номера ошибки.

Время выполнения запроса (полностью) превышает допустимое время работы скрипта (30 секунд) и посему вываливается таймаут от сервера, кроме того, при попытке обратиться к этой таблице в последствии тоже идет вис, она похоже блокируется. Отлипает где то через пару минут.

Чистый селект в скобках работает в районе 0.15 секунд, его я много раз перепроверял

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


#1093 - You can't specify target table 'keys' for update in FROM clause
DyaDya
На сайте с 11.04.2007
Offline
147
#3

Сколько записей выбирается в подзапросе? 30 секунд для подобных апдейтов иногда не так уж и много ;)

Попробуйте UPDATE выполнить через консоль! Рекомендую это проделывать на локальном компе, дабы сайт не заваливать.

Выбирайте качественный хостинг (http://vashmaster.ru/informaciya/o_poleznyh_programmah/news83.php) и продвигайте сайты в СЕОПУЛЬТ (http://seopult.ru/ref.php?ref=72b5ed9561fe66a1). А на «SAPE» я в обиде :) Не упрекайте за очепятки, пишу вслепую (http://ergosolo.ru/) и также делаю сайты (http://www.vashmaster.ru/) ;)
N
На сайте с 06.05.2007
Offline
419
#4

Кстати, может быть простое переименование таблиц сработает. Мне совсем негде проверить .

Сейчас нет ни одной причины сидеть на 4.1. Только программисты коммерческих решений его используют для тестов.

[Удален]
#5

Это не сайт, валить не жалко.

Выбирается 61 запись.

Проблемы с синтаксисом это не решает.

Вариант предложенный netwind щас попробую

neolord добавил 18.03.2009 в 17:10

netwind:
Кстати, может быть простое переименование таблиц сработает. Мне совсем негде проверить .
Сейчас нет ни одной причины сидеть на 4.1. Только программисты коммерческих решений его используют для тестов.

Переименование, если вы о присвоении таблице синонимов, там в запросе есть, посмотрите внимательно. Не работает :(

[Удален]
#6

neolord, либо я дурак, либо ктото из нас, лио я чтото путаю, но к чему такой мазахизм? не проще ли

update table1,table2,table3 set table1.state=0 where ... твое условие тут.

DyaDya
На сайте с 11.04.2007
Offline
147
#7
bearman:
update table1,table2,table3 set table1.state=0 where ... твое условие тут.

Могу пока только предположить, что будет похожая ошибка как и в первом посте у ТС.

Надеюсь, ТС опровергнет моё предположение.

N
На сайте с 06.05.2007
Offline
419
#8

не надо гадать, в документации по 4.1 ясно написано : http://dev.mysql.com/doc/refman/4.1/en/update.html

Currently, you cannot update a table and select from the same table in a subquery.

[Удален]
#9
bearman:
neolord, либо я дурак, либо ктото из нас, лио я чтото путаю, но к чему такой мазахизм? не проще ли

update table1,table2,table3 set table1.state=0 where ... твое условие тут.

там условие такое что требует distinct, либо группировку. Че то я сомневаюсь что сработает с группировкой, но тоже попробую

bubblegum777
На сайте с 04.05.2008
Offline
42
#10

Что за скрипт у вас, который виснет? так пробовали? :

$a=$pear_db->getCol(первый запрос);

$pear_db->query("update .... where `id` in (".implode(",",$a).")");

$pear_db - объект базы с использованием PEAR :: DB, в чистом mysql не помню как. Получить, короче, список ид в массив и поставить во второй запрос

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий