С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
 Аватар для allukard
307 / 218 / 70
Регистрация: 08.11.2010
Сообщений: 1,899

Как запросом удалить строки из двух таблиц!

19.05.2012, 10:06. Показов 4954. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как запросом удалить строки из двух таблиц!
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function delete_user($id)//Удаление usera!
{
    $result=mysql_query("SELECT `avatar`,`login` FROM `users` WHERE id='$id' LIMIT 1")or die('Запрос не удался: ' . mysql_error());
    if (!$result) return false;
    
    $myrow = mysql_fetch_array($result);
    $avatar = "../".$myrow['avatar'];
    if (!file_exists($avatar)) {echo "Файл $img не существует";}
    /*
echo "DELETE t1.`id`,t2.`author`
                                    FROM `users`  AS t1 
                                    JOIN `send` AS t2
        ON  t1.`id`='".$id."' and t2.`author`='".$myrow['login']."'";
        exit();*/
        
    if(unlink($avatar))
        {
        $delete_user= mysql_query("DELETE t1.`id`,t2.`author`
                                    FROM `users`  AS t1 
                                    JOIN `send` AS t2
        ON  t1.`id`='".$id."' and t2.`author`='".$myrow['login']."'")or die('Запрос не удался: ' . mysql_error());
            if ($delete_user) return true; else return false;   
        }
         else
        {
                return false;
        }   
}
пишет:Запрос не удался: Unknown table 'id' in MULTI DELETE
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.05.2012, 10:06
Ответы с готовыми решениями:

Как задать название таблицы, созданной запросом объединения двух таблиц
Добрый день всем. Подскажите пожалуста как задать название таблицы созданной запросом объеденнением двух таблиц: "SELECT...

Пожалуйста нужно разобраться с запросом Mysql! Одним запросом из двух таблиц / MySQL
У меня на главной странице существует вот такой запрос (он ниже), который вытаскивает из таблицы "glavnaya" нужные строки. ...

Как связать данные из двух таблиц и поместить их в третью? Желательно в Access SQL запросом
Имеется 3 таблицы: --Список студентов колледжа (ИД, ФИО, Дата рождения, Группа, Номер зачётки), --Отметки (ИД, Номер зачётки,...

9
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
19.05.2012, 10:25
Цитата Сообщение от Макc Посмотреть сообщение
MySQL
1
DELETE t1.`id`,t2.`author` ...
Удаляются-то записи, а не отдельные поля. Так получается "таблица `id` из базы `t1`".
MySQL
1
DELETE `t1`, `t2` ...
2
6 / 6 / 2
Регистрация: 05.05.2012
Сообщений: 23
19.05.2012, 10:27
В запросе к базе
PHP
1
2
3
4
$delete_user= mysql_query("DELETE t1.`id`,t2.`author`
                                    FROM `users`  AS t1 
                                    JOIN `send` AS t2
        ON  t1.`id`='".$id."' and t2.`author`='".$myrow['login']."'")or die('Запрос не удался: ' . mysql_error());
после ключевого слова ON указываются поля, по которым связаны у Вас таблицы (например, id пользователя). А Вы пытаетесь задать условие для удаления.
Поэтому после ON указываем связывающие поля (посмотрите в таблице send какое поле для связи с users отведено, я указал t2.`id`), и ниже в секции WHERE указывает условие для удаления:
PHP
1
2
3
4
5
$delete_user= mysql_query("DELETE t1.`id`,t2.`author`
                                    FROM `users`  AS t1 
                                    JOIN `send` AS t2
        ON  t1.`id`= t2.`id`
        WHERE t1.`id`='".$id."' and t2.`author`='".$myrow['login']."'")or die('Запрос не удался: ' . mysql_error());
И еще посмотрите какого типа поле id (текстовое или числовое). Если числовое, то одинарные кавычки в секции WHERE нужно убрать
1
 Аватар для allukard
307 / 218 / 70
Регистрация: 08.11.2010
Сообщений: 1,899
19.05.2012, 11:46  [ТС]
Блин не могу сообразить как сделать!
так я удаляю пользователя из Бд и мне нао удалить все сообщения отправленные и принятые этим пользователем!
таблица: send

таблица: users


этот запросс удаляет ток сообщение какие он отправил и все и Пользователя он не удаляет.
SQL
1
2
3
4
DELETE `t1`, `t2`
        FROM `users`  AS t1 
        JOIN `send` AS t2
        ON  t1.`id`='".$id."' AND t2.`author`='".$myrow['login']."'
таблицы у меня не связанные!
0
6 / 6 / 2
Регистрация: 05.05.2012
Сообщений: 23
19.05.2012, 18:38
Цитата Сообщение от Макc Посмотреть сообщение
мне нао удалить все сообщения отправленные и принятые этим пользователем!
этот запросс удаляет ток сообщение какие он отправил и все и Пользователя он не удаляет.
Вот так запрос удалит пользователя из таблицы users c указанным id и все сообщения из таблицы send, отправителем или получателем которого является пользователь с логином $myrow['login']
PHP
1
2
3
4
$result = mysql_query("DELETE users, send FROM users, send
        WHERE users.id = ".$id." AND
        (send.author = '".$myrow['login']."' OR
        send.addressee = '".$myrow['login']."')";
1
 Аватар для allukard
307 / 218 / 70
Регистрация: 08.11.2010
Сообщений: 1,899
20.05.2012, 09:05  [ТС]
Цитата Сообщение от kotoFF Посмотреть сообщение
Вот так запрос удалит пользователя из таблицы users c указанным id и все сообщения из таблицы send, отправителем или получателем которого является пользователь с логином $myrow['login']
PHP
1
2
3
4
$result = mysql_query("DELETE users, send FROM users, send
        WHERE users.id = ".$id." AND
        (send.author = '".$myrow['login']."' OR
        send.addressee = '".$myrow['login']."')";
Спасибо! запрос четко работает НО если пользователь не отсылал никому сообшения или он их удалил тоесть нет в таблице send то удаления не происходит!
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
20.05.2012, 09:19
Цитата Сообщение от Макc Посмотреть сообщение
если пользователь не отсылал никому сообшения ..., то удаления не происходит!
Надо LEFT JOIN:
MySQL
1
2
FROM `users`
  LEFT JOIN `send` ON ...
Для этого надо правильно писать условие объединения, иначе чревато.
Почему у Вас в `send` нет поля с id автора?
MySQL
1
2
3
4
DELETE `users`, `send`
FROM `users`
    LEFT JOIN `send` ON `users`.`id` = `send`.`author_id`
WHERE `users`.`id` = 42
2
 Аватар для allukard
307 / 218 / 70
Регистрация: 08.11.2010
Сообщений: 1,899
20.05.2012, 09:34  [ТС]
да да действительно надо было заносить в поля автора и получателя просто ID!(на будующее мне)
вот так вроде норм запрос!

MySQL
1
2
3
4
DELETE `users`, `send`
FROM `users`
LEFT JOIN `send` ON send.author = '".$myrow['login']."' OR send.addressee = '".$myrow['login']."'
WHERE `users`.`id` = ".$id."
Всем Спасибо за помощь!
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
20.05.2012, 12:19
Цитата Сообщение от Макc Посмотреть сообщение
SQL
1
ON send.author = '".$myrow['login']."' OR send.addressee = '".$myrow['login']."'
Если Вы разберетесь, как работает left join, то сразу же поймете, что такое условие приведет к удалению всех записей из обоих таблиц, если в юзерах найдется такой юзер.
Условие объединения и условие выборки - это в корне разные вещи!
Если с простыми inner join'ами (запятая - это тоже inner join без условия) эта разница практически не заметна, то с LEFT JOIN'ами непонимание этой разницы может быть чревато потерей данных, как в Вашем случае.

Итак, таблица юзеров users:
idname
1Вася
2Коля
3Саша

Таблица сообщений messages:
idauthormessage
11lorem
21ipsum
32dolor
42sit
54amet

При выполнении любого JOIN'а производятся следующие шаги:
  1. Пересечение каждой записи с каждой. 3 * 5 = 15:
    users.idusers.namemessages.idmessages.authormessages.message
    1Вася11lorem
    1Вася21ipsum
    1Вася32dolor
    1Вася42sit
    1Вася54amet
    2Коля11lorem
    2Коля21ipsum
    2Коля32dolor
    2Коля42sit
    2Коля54amet
    3Саша11lorem
    3Саша21ipsum
    3Саша32dolor
    3Саша42sit
    3Саша54amet
  2. Все записи проверяются условием объединения. Оно определяет, какие из этих записей пойдут на обработку дальше.
    • Для INNER JOIN'а если условие истинно, то запись проходит дальше. А если ложно, то запись тут же выбрасывается из обработки.
      MySQL
      1
      2
      3
      
      FROM `users`
          INNER JOIN `messages`
              ON `users`.`id` = `messages`.`author`
      users.idusers.namemessages.idmessages.authormessages.message
      1Вася11lorem
      1Вася21ipsum
      2Коля32dolor
      2Коля42sit

      Здесь все юзеры со всеми своими сообщениями каждый, но здесь нет юзеров без сообщений и нет сообщений без юзеров.
    • Для LEFT JOIN'а если условие истинно, то запись проходит дальше. Если же условие ложно и для данной записи из левой таблицы не нашлось ни одной записи из правой таблицы, то в результат дополнительно попадает эта запись из левой таблицы, где все поля правой таблицы имеют значения NULL:
      MySQL
      1
      2
      3
      
      FROM `users`
          LEFT JOIN `messages`
              ON `users`.`id` = `messages`.`author`
      users.idusers.namemessages.idmessages.authormessages.message
      1Вася11lorem
      1Вася21ipsum
      2Коля32dolor
      2Коля42sit
      3СашаNULLNULLNULL

      Здесь все юзеры. У кого есть сообщения, у того есть.
Уже после выполнения JOIN'ов наступает время для WHERE. Здесь Вы уже выбираете из получившегося набора только интересующие Вас записи.

Теперь смотрите, что выбирает запрос, аналогичный Вашему:
MySQL
1
2
3
FROM `users`
    LEFT JOIN `messages`
        ON `users`.`id` = 2 OR `messages`.`author` = 2
users.idusers.namemessages.idmessages.authormessages.message
1Вася32dolor
1Вася42sit
2Коля11lorem
2Коля21ipsum
2Коля32dolor
2Коля42sit
2Коля54amet
3Саша32dolor
3Саша42sit

Если Вы внимательно присмотритесь, то увидите, что из исходных таблиц сюда попали ВСЕ записи из обоих таблиц. В запросе DELETE это приведет к удалению их всех.

С учетом WHERE `users`.`id` = 2 удалится один юзер и вообще все сообшения.
3
 Аватар для allukard
307 / 218 / 70
Регистрация: 08.11.2010
Сообщений: 1,899
21.05.2012, 09:36  [ТС]
Vovan-VE, Спасибо!
Мдее.... как говоритсся мне еще учиться и учиться!! все так чётко расписано!
Кстати у меня Регистрация не позволяет создавать два одинаковых логина!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.05.2012, 09:36
Помогаю со студенческими работами здесь

Одним запросом из двух таблиц
Добрый день. Допустим у меня есть две таблицы. Первая таблица (apart) - таблица с квартирами. Вторая таблица (img) - таблица с...

Как удалить конкретную ячейку из строки? каким запросом?
Как удалить конкретную ячейку из строки? каким запросом? везде описывается только как с помощью DELETE удалить строки, а если допустим: ...

Помощь с запросом (извлечение данных из двух таблиц)
Добрый день, пытаюсь сделать объединение двух SQL запросов, но что-то не у меня ничего не получается. Смысл следующий: у меня идет в цикле...

Как удалить записи из двух не связанных таблиц
Как удалить записи из двух не связанных таблиц одним запросом? База данных Аксесс 2007, язык C#. Пробовал так: DeleteCommandText =...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru