Выборка дерева

Semen

Семён
Выборка дерева

Таблица:
id, pid, url, name, order

SELECT * FROM `dirs` ORDER BY `pid` , `order`

1 0 dir_1 Dir 1 1
4 0 dir_2 Dir 2 2
6 0 dir_3 Dir 3 3
2 1 dir_1_1 Dir 1_1 1
3 1 dir_1_2 Dir 1_2 2
5 4 dir_2_1 Dir 2_1 1

как выбрать вот так:

1 0 dir_1 Dir 1 1
2 1 dir_1_1 Dir 1_1 1
3 1 dir_1_2 Dir 1_2 2
4 0 dir_2 Dir 2 2
5 4 dir_2_1 Dir 2_1 1
6 0 dir_3 Dir 3 3
 

Вурдалак

Продвинутый новичок
Так одним запросом не выйдет. Либо order (твой столбец) используй по-другому.
 

Semen

Семён
ORDER BY url не пойдет, так как не содержит полный url.
Вижу 2 способа:
1. Перевести сначала многомерный массив и потоп парсить в HTML
2. Ввести дополнительное поле в базе для возможности необходимой выборки.
 

Вурдалак

Продвинутый новичок
Лучше всего, конечно, перейти на nested sets. Тогда одним запросом запросто.

Ну а поле дополнительно вроде как необязательно вводить. Просто order использовать по-другому:
Код:
1 0 dir_1 Dir 1 1
2 1 dir_1_1 Dir 1_1 2
3 1 dir_1_2 Dir 1_2 3
4 0 dir_2 Dir 2 4
5 4 dir_2_1 Dir 2_1 5
6 0 dir_3 Dir 3 6
 

LONGMAN

Dark Side of the Moon..
Nested хорош но проблемы вознизают после перемешения категории с субкатегориямы
 

Semen

Семён
Вот сделал так, выводит как мне надо
PHP:
$dirsList = '';
while ($dir = mysql_fetch_assoc($resource)){
	if (0 == $dir['pid']){
	$dirsList .= '<div id="dir_'.$dir['id'].'">'.$dir['name'].'</div><pid'.$dir['id'].'>';
	}else{
	$dirsList = str_replace('<pid'.$dir['pid'].'>', '<div id="dir_'.$dir['id'].'">'.$dir['name'].'</div><pid'.$dir['id'].'><pid'.$dir['pid'].'>', $dirsList);
	}
}
print preg_replace('/<pid\d+>/', '', $dirsList);
 

Фанат

oncle terrible
Команда форума
Жесть.
я сначала подумал, что тут materialized path
а оказалось - просто для красоты

-~{}~ 28.03.10 13:32:

в итоге, как я понял, остановились на парсинге в скрипте? ну и правильно, если информация умещается в 1 страницу
 

Semen

Семён
вот доделал чтобы выводило структуру с отступами
PHP:
$levelArray = array();
$marginLeft = 50;
$dirsList = '';
while ($dir = mysql_fetch_assoc($resource)){
	if (0 == $dir['pid']){
	$levelArray[$dir['id']] = 0;
	$dirsList .= '<div id="dir_'.$dir['id'].'">'.$dir['name'].'</div><pid'.$dir['id'].'>';
	}else{
	$levelArray[$dir['id']] = $levelArray[$dir['pid']]+1;
	$dirsList = str_replace('<pid'.$dir['pid'].'>', '<div style="margin-left:'.($levelArray[$dir['id']]*$marginLeft).'px" id="dir_'.$dir['id'].'">'.$dir['name'].'</div><pid'.$dir['id'].'><pid'.$dir['pid'].'>', $dirsList);
	}
}
print preg_replace('/<pid\d+>/', '', $dirsList);
 
Сверху