Вопрос № 70740: Здравствуйте!
Вопрос по MySQL 5
Встала задача при выборке/удалении данных использовать вложенные подзапросы. Как правильно это делать?
My attempts:
В самоучителе по MySQL (во всех, что попадались мне на глаза) написано, что она п...
Вопрос № 70.740
Здравствуйте!
Вопрос по MySQL 5
Встала задача при выборке/удалении данных использовать вложенные подзапросы. Как правильно это делать?
My attempts:
В самоучителе по MySQL (во всех, что попадались мне на глаза) написано, что она поддерживает вложенные запросы SELECT. Даже приведён пример -
SELECT `i` FROM `first` WHERE `s` IN (SELECT `i` FROM `second` WHERE `age`>18)
Но, пытаясь проделать нечто аналогичное, получаю ошибку - "You have an error in your SQL near 'SELECT `i` FROM `second` WHERE `age`>=18' at line 1 ..." Спрашивается: как же правильно?
Далее, в приведённом случае сложный запрос можно заменить обычным SELECT из нескольких таблиц: SELECT `first`.`i` FROM `first`, `second` WHERE `first`.`s`=`second`.`i` AND `second`.`age`>=18
Но что делать, когда на основании вложенного запроса принимается решение об удалении записей?
Пробовалось следующее:
DELETE FROM `first` WHERE `s` IN (SELECT `i` FROM `second` WHERE `age`<18)
Ошибка такая же, как приведена выше.
DELETE FROM `first`, `second` <...> - не работает, выдаёт ошибку, да и по логике понятно - нет смысла удалять что-то из создаваемой временной таблицы. Вариант (опять-таки из самоучителя)
DELETE FROM `first` USING `first`, `second` WHERE `first`.`s`=`second`.`i` AND `second`.`age`<18
в ошибке цитирует всё от USING включительно до конца запроса.
Как быть?
Отвечает: Архангельский Андрей Германович
Здравствуйте, Олег Владимирович!
Запрос
Select Fld1 from Table1 where fld2 in (Select Fld3 from Table2 where Age>18)
Означает выбрать из таблицы1 строки, значения поля Fld2 которых существуют в результатах запроса указанного в скобках (Table2)
Ошибка может быть в том что типы данных Fld2 и Fld3 не совпадают, а MySQL не детализирует ошибки.
Подробнее об этих операторах см. Мартин Грабер "Понимание SQL" изд.Лори - классическая книга, в которой все очень подробно разжевано.
--------- Если дело заслуживает быть сделаным, то оно заслуживает, чтобы его сделали ХОРОШО
Отвечает: Загиров Рустам
Здравствуйте, Олег Владимирович!
У вас в выражении :SELECT `i` FROM `first` WHERE `s` IN (SELECT `i` FROM `second` WHERE `age`>18)
сравнивается поле `s` и `i`, они наверное разного типа. Наверное, надо такой запрос:
SELECT `i` FROM `first` WHERE `i` IN (SELECT `i` FROM `second` WHERE `age`>18)