Доброго времени суток,
Есть следующий запрос:
UPDATE `SC_products` SET `SC_products`.`enabled`=0 WHERE `SC_products`.`productID` IN (SELECT DISTINCT `SC_products`.`productID` FROM
`SC_products` LEFT JOIN `SC_product_options_set`
ON `SC_product_options_set`.`productID` = `SC_products`.`productID`
WHERE `SC_product_options_set`.`productID` IS NULL AND `SC_products`.`enabled` = 1)
В скобках я вычисляю из таблицы products строки, где productID совпадает с productID из product_options_set, из этой разницы делаю выборку по строкам, где enabled = 1
Далее я пытаюсь присвоить этим productID enabled = 0, на что mysql ругается: #1093 - You can't specify target table 'SC_products' for update in FROM clause
Возможно в общем случае это и не безопасно, но в моём должно работать. Как можно оптимизировать запрос, чтобы работало?
Заранее спасибо!
Примечание:
решил задачу гораздо более простым и изящным запросом
UPDATE `SC_products` SET `SC_products`.`enabled`=0 WHERE `SC_products`.`productID` NOT IN (SELECT DISTINCT `SC_product_options_set`.`productID` FROM
`SC_product_options_set`)
но вопрос - как устранить такую ошибку, не меняя решения кардинально, остаётся открытым
Примечание:
>>Хотя одно не понятно: разве Ваш подзапрос не возвращает пустое множество всегда, то есть update запрос не изменяет ничего.
нет, с позапросом всё нормально. он вычитает из products строки, где productID совпадает с productID из product_options_set. Более простой пример -
http://stackoverflow.com/questions/2723839/mysql-difference-of-two-result-sets
за советы спасибо!
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.