Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление древовидных записей 
:(
    Опции темы
Aver78
Дата 23.8.2009, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 21.4.2007

Репутация: нет
Всего: нет



В общем то, я так думаю , тема довольно избитая, но мне раньше делать оптимизированно не было необходимости, а теперь вот пришлось.
Суть - есть  категории неограниченной вложенности, в каждой может присутствовать неограниченно количество страниц. Как оптимально удалять все подкатегории и страницы на них, при удалении категории верхнего уровня.
 Категории и страницы в разных таблицах заданы как id, parent_id. Вызывать удаление рекурсивно не хотелось бы, уж больно много запросов может выйти.
PM MAIL   Вверх
gcc
Дата 23.8.2009, 02:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 3
Всего: 17



1) вот обновление, всех поддревиьев в низ и их разделов, переделай вод DELETE

Код

UPDATE section AS t4 LEFT JOIN section t2 ON t4.parent_se_id = t2.id_se
SET t4.active_se = 1 - t4.active_se
WHERE t2.parent_se_id = 54 or t4.parent_se_id = 54 


2) fork форни в другой процесс

Код


my $parent=$$; 
my $child=fork(); 

if($$ == $parent){ 

    # print "Parent: pid=$$;($parent)\n"; 

} else {


   eval {
   
         my $sql_par = 'SELECT '.$args[1].'
                              FROM section
                            WHERE    id_se = '.$args[2].'
                            LIMIT 1';
        
     my $sth = $dbh->prepare($sql_par);
        $sth->execute(); 
    my $section = $sth->fetchrow_arrayref();     
    
    # my $up_id_se = $section->[0] == 1 ? '0' : '1';

        my $sql_par = 'SELECT id_se
                              FROM section
                            WHERE
                    parent_se_id = '.$args[2].'
                      
                    UNION
                      
                    SELECT t1.id_se
                    FROM
                    section t1 JOIN section t2
             ON t1.parent_se_id = t2.id_se
                    WHERE
              t2.parent_se_id = '.$args[2];
        
     my $sth = $dbh->prepare($sql_par);
        $sth->execute();          
            
            while ( my $email = $sth->fetchrow_arrayref() ) {    
       
       
    $dbh->do( 'DELETE FROM section
                WHERE id_se = '.$email->[0]  , undef, undef );       
       
                }
                
           $sth->finish();     
     

       };
                 if ($@) {
                 print "error";
                 $c->detach();
                 
                 }

# kill("TERM", $child); 

}      

 waitpid $child,0;



3) в NestedSet легко

4) процедура

Это сообщение отредактировал(а) gcc - 23.8.2009, 02:58
PM WWW ICQ Skype GTalk Jabber   Вверх
Aver78
Дата 23.8.2009, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 21.4.2007

Репутация: нет
Всего: нет



Цитата

UPDATE section AS t4 LEFT JOIN section t2 ON t4.parent_se_id = t2.id_se
SET t4.active_se = 1 - t4.active_se
WHERE t2.parent_se_id = 54 or t4.parent_se_id = 54 


Что то я нифига не могу понять принцип работы данного запроса, приведи структуру таблиц к которым он применяется.
PM MAIL   Вверх
gcc
Дата 24.8.2009, 05:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 3
Всего: 17



Aver78,  id, parent_id, active

Добавлено позже
Aver78,  id, parent_id, active
PM WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0932 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.