Просмотр полной версии : [Вопрос] DELETE запрос с SELECT запросом. MySQL
Есть две таблицы:
bank (account, ...)
account(id, name, ...)
Нужно составить DELETE запрос из таблицы bank так, что бы bank.account = account.id по данному account.name. Вроде бы все логично обьясил.
Пробовал гуглить, в итоге получались такие запросы:
DELETE FROM bank WHERE account IN (SELECT id FROM account WHERE name = Dave_Mirra)
DELETE FROM bank LEFT JOIN bank ON account.id = bank.account WHERE account.name = Dave_Mirra
Так в чём заключается вопрос?
Собственно запросы получались нерабочие. Немного поправив первый запрос, вышел на успех -
DELETE FROM bank WHERE account IN (SELECT id FROM account WHERE name = 'Dave_Mirra')
Однако, если таблиц больше -
account (id, name, ...)
bank (account, ...)
captchalog (account, ...)
employment_history (account, ...)
setname (account, ...)
transfers_log (account, ...)
Как быть?
Собственно запросы получались нерабочие. Немного поправив первый запрос, вышел на успех -
DELETE FROM bank WHERE account IN (SELECT id FROM account WHERE name = 'Dave_Mirra')
Однако, если таблиц больше -
account (id, name, ...)
bank (account, ...)
captchalog (account, ...)
employment_history (account, ...)
setname (account, ...)
transfers_log (account, ...)
Как быть?
DELETE FROM bank, captchalog, employment_history, setname, transfers_log WHERE account IN (SELECT id FROM account WHERE name = 'Dave_Mirra')
DELETE FROM bank, captchalog, employment_history, setname, transfers_log WHERE account IN (SELECT id FROM account WHERE name = 'Dave_Mirra')
Вы свой запрос проверяли? Было бы так просто, я бы сюда не писал. Очевидно требуется использование LEFT JOIN, но у меня не хватает знаний для правильной формулировки запроса.
Собственно запросы получались нерабочие. Немного поправив первый запрос, вышел на успех -
DELETE FROM bank WHERE account IN (SELECT id FROM account WHERE name = 'Dave_Mirra')
Однако, если таблиц больше -
account (id, name, ...)
bank (account, ...)
captchalog (account, ...)
employment_history (account, ...)
setname (account, ...)
transfers_log (account, ...)
Как быть?
Для каждой таблицы делать свой запрос, не? А ещё лучше сначала узнать ID аккаунта отдельным запросом, а потом уже отправить в каждую таблицу запрос на удаление с уже известным ID.
И в твоём случае можно просто ставить "=" вместо "IN".
DELETE FROM bank WHERE account = (SELECT id FROM account WHERE name = 'Dave_Mirra')// Подзапросом SELECT получаем ID аккаунта и после сверяем его с "account"
"IN" обычно используется, когда нужно в одном запросе проверить несколько результатов и чтоб не городить кучу условий с OR, делают просто "IN(условие_1, условие_2, условие_3, ..., условие_n)".
Для каждой таблицы делать свой запрос, не? А ещё лучше сначала узнать ID аккаунта отдельным запросом, а потом уже отправить в каждую таблицу запрос на удаление с уже известным ID.
И в твоём случае можно просто ставить "=" вместо "IN".
DELETE FROM bank WHERE account = (SELECT id FROM account WHERE name = 'Dave_Mirra')// Подзапросом SELECT получаем ID аккаунта и после сверяем его с "account"
"IN" обычно используется, когда нужно в одном запросе проверить несколько результатов и чтоб не городить кучу условий с OR, делают просто "IN(условие_1, условие_2, условие_3, ..., условие_n)".
Отлично, и получить 6 бессмысленных запросов. Очевидно, самый простой выход сменить все таблицы на InnoBD и связать таблицы с каскадным обновлением / удалением. Тогда даже никаких запросов не нужно, так и поступлю
Отлично, и получить 6 бессмысленных запросов. Очевидно, самый простой выход сменить все таблицы на InnoBD и связать таблицы с каскадным обновлением / удалением. Тогда даже никаких запросов не нужно, так и поступлю
Эти 6 бессмысленных запросов не сделают погоды. А ты, тем временем, тратишь кучу времени впустую, дабы решить проблему, которую сам и выдумал :dntknw:
Эти 6 бессмысленных запросов не сделают погоды. А ты, тем временем, тратишь кучу времени впустую, дабы решить проблему, которую сам и выдумал :dntknw:
У него MyISAM и, как я понял, это не поддерживает связей между таблицами. Можно просто использовать InnoDB и создать связи с каскадным удалением.
У него MyISAM и, как я понял, это не поддерживает связей между таблицами. Можно просто использовать InnoDB и создать связи с каскадным удалением.
Так никто и не говорит, что нельзя. Речь лишь о том, что стоили те дни, что он потратил на решение проблемы, которой нет?
6 запросов не заставят сервер лагать и не создадут проблем. И то, что он реализует удаление через связи, а не запросами, не изменит ничего, кроме количества кода, но за это он заплатил кучей времени.
Я не пытаюсь сказать, что реализовывать подобное через связи не стоит. Отнюдь, это даже упростит код, если понимающе всё сделать. Я лишь говорю, что не стоит придавать этому такую важность, ибо и без связей всё будет прекрасно работать.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot