Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Запуск запроса в зависимости от результатов другого запроса

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Longi
Отправлено: 19 Января, 2012 - 15:28:18
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




Здраствуйте! Сначало объясню что у меня есть и что мне нужно...
Значит у меня есть таблица в которой я храню каталог древовидной структуры.
Поля id, parent, hasChild.

Задача следующая, при удалении раздела, нужно проверить есть ли у его родителя, еще подразделы, если таких не имеется то hasChild родителя присвоить 0.

Сейчас у меня это делает в 2 запроса, первый удаляет раздел, второй делает все остальное.

Теперь вопрос: Можно ли это както объеденить в один запрос, типо если удаление прошло успешно, сделать все остальное?

Вот код который у меня есть.

PHP:
скопировать код в буфер обмена
  1.  
  2.        $query = "DELETE FROM catalog WHERE id = ".$id;
  3.         if(DB::$Link->query($query)){
  4.             $query =
  5.             "UPDATE catalog JOIN (
  6.                /*Подсчитываем количество подразделов у найденого родителя*/
  7.                SELECT COUNT( id ) AS childCount, r1.parent AS parent
  8.                FROM catalog
  9.                    JOIN (
  10.                        /*Находим родителя удаляемого раздела*/
  11.                        SELECT catalog.parent AS parent
  12.                        FROM catalog
  13.                        WHERE id =".$id."
  14.                    ) AS r1
  15.                WHERE catalog.parent = r1.parent
  16.            ) AS r2
  17.            /* обновляем hasChild родительского раздела*/
  18.            SET hasChild = ( r2.childCount > 0 ) WHERE id = r2.parent";
  19.             DB::$Link->query($query);            
  20.         }
  21.  


И еще походу вопрос, можно ли организовать рекурсивный запрос? Для того чтобы удалить все подразделы удаленного раздела и тд..

Пока это у меня сделанно както так:

PHP:
скопировать код в буфер обмена
  1.  
  2. $allId = $id;
  3. $idList = $id;
  4. do{
  5.     $query = "SELECT GROUP_CONCAT(DISTINCT id) AS idList FROM catalog WHERE parent IN (".$idList.")";
  6.     $result = DB::$Link->query($query);
  7.     if(!$result) break;
  8.     $idList = $result->fetch_object()->idList;
  9.     $allId .=', '.$idList;
  10. }while($idList);
  11. $query = "DELETE FROM catalog WHERE id IN (".$allId.")";
  12. DB::$Link->query($query);
  13.  


Благодарю за любые ответы))

(Отредактировано автором: 19 Января, 2012 - 15:52:05)

 
 Top
Мелкий Супермодератор
Отправлено: 19 Января, 2012 - 15:49:57
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Longi пишет:
можно ли организовать рекурсивный запрос?

Mysql - не умеет.

Longi пишет:
Можно ли это както объеденить в один запрос, типо если удаление прошло успешно, сделать все остальное?

Можно в транзакцию обернуть.


-----
PostgreSQL DBA
 
 Top
Longi
Отправлено: 19 Января, 2012 - 15:55:06
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




Мелкий пишет:
Можно в транзакцию обернуть.


Спасибо огромное, MyISAM, если я не ошибаюсь транзакции не поддерживает?
 
 Top
Мелкий Супермодератор
Отправлено: 19 Января, 2012 - 16:07:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Да, только innoDB транзакционен. И при этом работает Ниндзя


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB