Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 10 из 10
  1. #1
    Аватар для 123
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.02.2014
    Сообщений
    93
    Репутация:
    8 ±

    DELETE запрос с SELECT запросом. MySQL

    Есть две таблицы:
    bank (account, ...)
    account(id, name, ...)

    Нужно составить DELETE запрос из таблицы bank так, что бы bank.account = account.id по данному account.name. Вроде бы все логично обьясил.

    Пробовал гуглить, в итоге получались такие запросы:

    PHP код:
    DELETE FROM bank WHERE account IN (SELECT id FROM account WHERE name Dave_Mirra
    PHP код:
    DELETE FROM bank LEFT JOIN bank ON account.id bank.account WHERE account.name Dave_Mirra 

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Так в чём заключается вопрос?
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. #3
    Аватар для 123
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.02.2014
    Сообщений
    93
    Репутация:
    8 ±
    Собственно запросы получались нерабочие. Немного поправив первый запрос, вышел на успех -

    PHP код:
    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, ...)

    Как быть?

  4. #4
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от 123 Посмотреть сообщение
    Собственно запросы получались нерабочие. Немного поправив первый запрос, вышел на успех -

    PHP код:
    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')

  5. #5
    Аватар для 123
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.02.2014
    Сообщений
    93
    Репутация:
    8 ±
    Цитата Сообщение от StevenH Посмотреть сообщение
    DELETE FROM bank, captchalog, employment_history, setname, transfers_log WHERE account IN (SELECT id FROM account WHERE name = 'Dave_Mirra')
    Вы свой запрос проверяли? Было бы так просто, я бы сюда не писал. Очевидно требуется использование LEFT JOIN, но у меня не хватает знаний для правильной формулировки запроса.

  6. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от 123 Посмотреть сообщение
    Собственно запросы получались нерабочие. Немного поправив первый запрос, вышел на успех -

    PHP код:
    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".
    PHP код:
    DELETE FROM bank WHERE account = (SELECT id FROM account WHERE name 'Dave_Mirra')// Подзапросом SELECT получаем ID аккаунта и после сверяем его с "account" 
    "IN" обычно используется, когда нужно в одном запросе проверить несколько результатов и чтоб не городить кучу условий с OR, делают просто "IN(условие_1, условие_2, условие_3, ..., условие_n)".
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  7. #7
    Аватар для 123
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.02.2014
    Сообщений
    93
    Репутация:
    8 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Для каждой таблицы делать свой запрос, не? А ещё лучше сначала узнать ID аккаунта отдельным запросом, а потом уже отправить в каждую таблицу запрос на удаление с уже известным ID.

    И в твоём случае можно просто ставить "=" вместо "IN".
    PHP код:
    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 и связать таблицы с каскадным обновлением / удалением. Тогда даже никаких запросов не нужно, так и поступлю

  8. #8
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от 123 Посмотреть сообщение
    Отлично, и получить 6 бессмысленных запросов. Очевидно, самый простой выход сменить все таблицы на InnoBD и связать таблицы с каскадным обновлением / удалением. Тогда даже никаких запросов не нужно, так и поступлю
    Эти 6 бессмысленных запросов не сделают погоды. А ты, тем временем, тратишь кучу времени впустую, дабы решить проблему, которую сам и выдумал
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  9. #9
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Эти 6 бессмысленных запросов не сделают погоды. А ты, тем временем, тратишь кучу времени впустую, дабы решить проблему, которую сам и выдумал
    У него MyISAM и, как я понял, это не поддерживает связей между таблицами. Можно просто использовать InnoDB и создать связи с каскадным удалением.

  10. #10
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    У него MyISAM и, как я понял, это не поддерживает связей между таблицами. Можно просто использовать InnoDB и создать связи с каскадным удалением.
    Так никто и не говорит, что нельзя. Речь лишь о том, что стоили те дни, что он потратил на решение проблемы, которой нет?
    6 запросов не заставят сервер лагать и не создадут проблем. И то, что он реализует удаление через связи, а не запросами, не изменит ничего, кроме количества кода, но за это он заплатил кучей времени.

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

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •