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

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

19.05.2012, 10:06. Показов 4987. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru