Здраствуйте! Сначало объясню что у меня есть и что мне нужно...
Значит у меня есть таблица в которой я храню каталог древовидной структуры.
Поля id, parent, hasChild.
Задача следующая, при удалении раздела, нужно проверить есть ли у его родителя, еще подразделы, если таких не имеется то hasChild родителя присвоить 0.
Сейчас у меня это делает в 2 запроса, первый удаляет раздел, второй делает все остальное.
Теперь вопрос: Можно ли это както объеденить в один запрос, типо если удаление прошло успешно, сделать все остальное?
Вот код который у меня есть.
PHP:
скопировать код в буфер обмена
$query = "DELETE FROM catalog WHERE id = ".$id; if(DB::$Link->query($query)){ $query = "UPDATE catalog JOIN ( /*Подсчитываем количество подразделов у найденого родителя*/ SELECT COUNT( id ) AS childCount, r1.parent AS parent FROM catalog JOIN ( /*Находим родителя удаляемого раздела*/ SELECT catalog.parent AS parent FROM catalog WHERE id =".$id." ) AS r1 WHERE catalog.parent = r1.parent ) AS r2 /* обновляем hasChild родительского раздела*/ SET hasChild = ( r2.childCount > 0 ) WHERE id = r2.parent"; DB::$Link->query($query); }
И еще походу вопрос, можно ли организовать рекурсивный запрос? Для того чтобы удалить все подразделы удаленного раздела и тд..
Пока это у меня сделанно както так:
PHP:
скопировать код в буфер обмена
$allId = $id; $idList = $id; do{ $query = "SELECT GROUP_CONCAT(DISTINCT id) AS idList FROM catalog WHERE parent IN (".$idList.")"; $result = DB::$Link->query($query); if(!$result) break; $idList = $result->fetch_object()->idList; $allId .=', '.$idList; }while($idList); $query = "DELETE FROM catalog WHERE id IN (".$allId.")"; DB::$Link->query($query);
Благодарю за любые ответы))(Отредактировано автором: 19 Января, 2012 - 15:52:05)
|