- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Как снизить ДРР до 4,38% и повысить продажи с помощью VK Рекламы
Для интернет-магазина инженерных систем
Мария Лосева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
есть такой запрос
Возвращает список идишников в таблице `keys`, для которых надо поле `state` поменять с 0 на 1. Что еще там есть в keys это неважно. Сам запрос работает, сделать его проще нельзя (необходимо линковать три таблицы по любому).
Соответственно как такой запрос прилепить к апдейту?
при попытке сделать вот так
Скрипт (phpmyadmin и собственный) виснет наглухо.
Версия mysql 4.1, посему WHERE EXISTS (подзапрос) возвращает ошибку
Спасибо всем откликнувшимся
АПД:
В предложенном мной варианте с update после легких ухищрений виса не возникает
Но пишет ошибку мол нельзя использовать `keys` для обновления ибо стоит он во FROM
"виснет наглухо" - это не диагностика, а ваше восприятие ошибки.
Диагностикой мог бы являться номер ошибки или точное время выполнения запроса.
Замерьте сколько времени работает чистый 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 временную таблицу.
Вот не надо тут ставить под сомнение мое восприятие. Наглухо значит наглухо. Поясняю :
Нет номера ошибки.
Время выполнения запроса (полностью) превышает допустимое время работы скрипта (30 секунд) и посему вываливается таймаут от сервера, кроме того, при попытке обратиться к этой таблице в последствии тоже идет вис, она похоже блокируется. Отлипает где то через пару минут.
Чистый селект в скобках работает в районе 0.15 секунд, его я много раз перепроверял
Да это в общем уже и не важно, с висом я проблему решил, как теперь обойти этот запрет на апдейт таблицы с условием, связанным с подзапросом к ней.
#1093 - You can't specify target table 'keys' for update in FROM clause
Сколько записей выбирается в подзапросе? 30 секунд для подобных апдейтов иногда не так уж и много ;)
Попробуйте UPDATE выполнить через консоль! Рекомендую это проделывать на локальном компе, дабы сайт не заваливать.
Кстати, может быть простое переименование таблиц сработает. Мне совсем негде проверить .
Сейчас нет ни одной причины сидеть на 4.1. Только программисты коммерческих решений его используют для тестов.
Это не сайт, валить не жалко.
Выбирается 61 запись.
Проблемы с синтаксисом это не решает.
Вариант предложенный netwind щас попробую
neolord добавил 18.03.2009 в 17:10
Кстати, может быть простое переименование таблиц сработает. Мне совсем негде проверить .
Сейчас нет ни одной причины сидеть на 4.1. Только программисты коммерческих решений его используют для тестов.
Переименование, если вы о присвоении таблице синонимов, там в запросе есть, посмотрите внимательно. Не работает :(
neolord, либо я дурак, либо ктото из нас, лио я чтото путаю, но к чему такой мазахизм? не проще ли
update table1,table2,table3 set table1.state=0 where ... твое условие тут.
update table1,table2,table3 set table1.state=0 where ... твое условие тут.
Могу пока только предположить, что будет похожая ошибка как и в первом посте у ТС.
Надеюсь, ТС опровергнет моё предположение.
не надо гадать, в документации по 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.
neolord, либо я дурак, либо ктото из нас, лио я чтото путаю, но к чему такой мазахизм? не проще ли
update table1,table2,table3 set table1.state=0 where ... твое условие тут.
там условие такое что требует distinct, либо группировку. Че то я сомневаюсь что сработает с группировкой, но тоже попробую
Что за скрипт у вас, который виснет? так пробовали? :
$a=$pear_db->getCol(первый запрос);
$pear_db->query("update .... where `id` in (".implode(",",$a).")");
$pear_db - объект базы с использованием PEAR :: DB, в чистом mysql не помню как. Получить, короче, список ид в массив и поставить во второй запрос