PDA

Просмотр полной версии : [Вопрос] DELETE запрос с SELECT запросом. MySQL



123
01.01.2018, 07:43
Есть две таблицы:
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

DeimoS
01.01.2018, 13:54
Так в чём заключается вопрос?

123
01.01.2018, 14:22
Собственно запросы получались нерабочие. Немного поправив первый запрос, вышел на успех -


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, ...)

Как быть?

StevenH
01.01.2018, 14:54
Собственно запросы получались нерабочие. Немного поправив первый запрос, вышел на успех -


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')

123
01.01.2018, 15:01
DELETE FROM bank, captchalog, employment_history, setname, transfers_log WHERE account IN (SELECT id FROM account WHERE name = 'Dave_Mirra')

Вы свой запрос проверяли? Было бы так просто, я бы сюда не писал. Очевидно требуется использование LEFT JOIN, но у меня не хватает знаний для правильной формулировки запроса.

DeimoS
01.01.2018, 16:44
Собственно запросы получались нерабочие. Немного поправив первый запрос, вышел на успех -


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)".

123
01.01.2018, 16:52
Для каждой таблицы делать свой запрос, не? А ещё лучше сначала узнать 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 и связать таблицы с каскадным обновлением / удалением. Тогда даже никаких запросов не нужно, так и поступлю

DeimoS
01.01.2018, 17:47
Отлично, и получить 6 бессмысленных запросов. Очевидно, самый простой выход сменить все таблицы на InnoBD и связать таблицы с каскадным обновлением / удалением. Тогда даже никаких запросов не нужно, так и поступлю

Эти 6 бессмысленных запросов не сделают погоды. А ты, тем временем, тратишь кучу времени впустую, дабы решить проблему, которую сам и выдумал :dntknw:

ziggi
02.01.2018, 12:11
Эти 6 бессмысленных запросов не сделают погоды. А ты, тем временем, тратишь кучу времени впустую, дабы решить проблему, которую сам и выдумал :dntknw:

У него MyISAM и, как я понял, это не поддерживает связей между таблицами. Можно просто использовать InnoDB и создать связи с каскадным удалением.

DeimoS
02.01.2018, 15:39
У него MyISAM и, как я понял, это не поддерживает связей между таблицами. Можно просто использовать InnoDB и создать связи с каскадным удалением.

Так никто и не говорит, что нельзя. Речь лишь о том, что стоили те дни, что он потратил на решение проблемы, которой нет?
6 запросов не заставят сервер лагать и не создадут проблем. И то, что он реализует удаление через связи, а не запросами, не изменит ничего, кроме количества кода, но за это он заплатил кучей времени.

Я не пытаюсь сказать, что реализовывать подобное через связи не стоит. Отнюдь, это даже упростит код, если понимающе всё сделать. Я лишь говорю, что не стоит придавать этому такую важность, ибо и без связей всё будет прекрасно работать.