Консультация № 70740
13.01.2007, 13:52
0.00 руб.
0 3 2
Здравствуйте!
Вопрос по 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 включительно до конца запроса.
Как быть?

Обсуждение

Неизвестный
13.01.2007, 14:14
общий
это ответ
Здравствуйте, Олег Владимирович!
Запрос

Select Fld1 from Table1 where fld2 in (Select Fld3 from Table2 where Age>18)

Означает выбрать из таблицы1 строки, значения поля Fld2 которых существуют в результатах запроса указанного в скобках (Table2)
Ошибка может быть в том что типы данных Fld2 и Fld3 не совпадают, а MySQL не детализирует ошибки.

Подробнее об этих операторах см. Мартин Грабер "Понимание SQL" изд.Лори - классическая книга, в которой все очень подробно разжевано.
Неизвестный
13.01.2007, 14:20
общий
это ответ
Здравствуйте, Олег Владимирович!
У вас в выражении :SELECT `i` FROM `first` WHERE `s` IN (SELECT `i` FROM `second` WHERE `age`>18)
сравнивается поле `s` и `i`, они наверное разного типа. Наверное, надо такой запрос:
SELECT `i` FROM `first` WHERE `<b>i</b>` IN (SELECT `i` FROM `second` WHERE `age`>18)
Неизвестный
13.01.2007, 16:33
общий
`i` в обеих таблицах INT AUTO_INCREMENT PRIMARY KEY`s` служит для связи со строкой таблицы `second` и тоже имеет тип INTЗапрос SELECT `first`.`i` FROM `first`, `second` WHERE `first`.`s`=`second`.`i` AND `second`.`age`>= 18 работает. Вряд ли он бы работал при `first`.`s` и `second`.`i` разных типов.
Форма ответа