Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Удаление древовидных записей


Автор: Aver78 23.8.2009, 00:41
В общем то, я так думаю , тема довольно избитая, но мне раньше делать оптимизированно не было необходимости, а теперь вот пришлось.
Суть - есть  категории неограниченной вложенности, в каждой может присутствовать неограниченно количество страниц. Как оптимально удалять все подкатегории и страницы на них, при удалении категории верхнего уровня.
 Категории и страницы в разных таблицах заданы как id, parent_id. Вызывать удаление рекурсивно не хотелось бы, уж больно много запросов может выйти.

Автор: gcc 23.8.2009, 02:55
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) процедура

Автор: Aver78 23.8.2009, 20:19
Цитата

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 


Что то я нифига не могу понять принцип работы данного запроса, приведи структуру таблиц к которым он применяется.

Автор: gcc 24.8.2009, 05:34
Aver78,  id, parent_id, active

Добавлено позже
Aver78,  id, parent_id, active

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)