Nested Sets вывести структуру при помощи одного запроса

-faqer-

Я только учусь
Nested Sets вывести структуру при помощи одного запроса

Начал разбираться с
Структуру храню в
PHP:
CREATE TABLE categories (
  c_id int(10) unsigned NOT NULL auto_increment,
  c_left int(10) unsigned NOT NULL default '0',
  c_right int(10) unsigned NOT NULL default '0',
  c_level int(10) unsigned NOT NULL default '0',
  title varchar(255) NOT NULL default '',
  PRIMARY KEY  (c_id),
  KEY cat_left (c_left,c_right,c_level)
) TYPE=MyISAM;
Есть каталог
Категория 1
Категория 1.1
Категория 1.2
Категория 1.2.1
Категория 1.2.2
Категория 1.3
Категория 1.3.1
Категория 1.3.2
Категория 2
Категория 2.1
Категория 2.2
Категория 3

Не могу понять как однима запросом передавая id, допустим, категории 1.2.2
получить следующее
Категория 1
Категория 1.1
Категория 1.2
Категория 1.2.1
Категория 1.2.2
Категория 1.3
Категория 2
Категория 3
Т.е. когда человек будет постепенно углубляться в каталог, раскрывть новый и новый уровень вложения, подчиненный категории, на которую кликнул этот самый человек
 

SiMM

Новичок
Нифига не понял, что требуется, но довольно толково всё описано здесь
PS: и почему сразу одним? Это так принципиально? Хотя, если потратить время на обдумывание вопроса - может быть и сам догадаешься :) А вообще - в таких случаях иногда помогает карандаш и бумага - попробуй изобразить своё дерево.
 

Макс

Старожил PHPClub
одним запросом нельзя (по крайней мере в старых версиях mysql нельзя было). Как сделать 2-мя запросами уже обсуждалось несколько раз. Воспользуйся поиском
 

-faqer-

Я только учусь
По данному адресу я не нашел ответа
Объясню пошагово
Человек попал в каталог
Категория 1
Категория 2
Категория 3

Кликает 1:
Категория 1
Категория 1.1
Категория 1.2
Категория 1.3
Категория 2
Категория 3

Кликает 2:
Категория 1
Категория 1.1
Категория 1.2
Категория 1.2.1
Категория 1.2.2
Категория 1.3
Категория 2
Категория 3

Кликает Категория 1.2.2:
Категория 1
Категория 1.1
Категория 1.2
Категория 1.2.1
Категория 1.2.2
Категория 1.3
Категория 2
Категория 3

Т.е. получая идентификатор, скрипт, выводит родственников данной категории и родственников всех ее предков

-~{}~ 18.01.05 00:07:

Честно признаюсь, поиском пользовался усердно
Но ответа на этот вопрос не нашел:(

-~{}~ 18.01.05 00:25:

2 Макс
Нашел по словам "2-мя запросами" (в жизни бы не пришел в голову такой запрос) вот эту ветку http://phpclub.ru/talk/showthread.php?s=&threadid=50309
В которой есть твой же пост

>>поищи по форуму. Делается 2-мя запросами :
>>- первый запрос определяет всех родителей для указанного ID
>>- второй для каждого родителя выводит его >>непосредственных детей (без внуков/правнуков)
Так это что рекурсия????
Не хотелось бы

-~{}~ 18.01.05 01:30:

Сделал я вот таким вот извратным способом
PHP:
$id = (isset ($_GET ['id'])) ? intval ($_GET ['id']) : 1;
//Получаем все данные о данном узле
$item = mysql_fetch_assoc ($dbh->query ("SELECT * FROM ".$table." WHERE c_id = ".$id));
//Вычисляем весь путь от корневого узла до данного включительно
$query="SELECT * FROM ".$table." WHERE c_left <= ".$item ['c_left']." AND c_right >= ".$item ['c_right']." ORDER BY c_left ASC";
$result=$dbh->query($query);
$where = '';
//Генерим вот такое вот мутное условие
while($row = $dbh->fetch_array($result)) {
    $where .= " c_id = ".$row ['c_id']." OR (c_left > ".$row ['c_left']." AND c_right < ".$row ['c_right']." AND c_level = ".$row ['c_level']."+1) OR";
}
//Делаем последний запрос
$query2 = "SELECT * FROM ".$table." WHERE".substr ($where, 0, -3)." ORDER BY c_left ASC";
Что-то оно мне не особенно.... нравится
Можно как-то лаконичнее
 

Евгений Ищенко

Guest
Если честно, то ничего не понял. Работаю с БД oracle, но это не важно. Суть в том что если нужно строить древовидную структуру, то в БД вносятся ID и Parent_ID, и все спокойно рисуется.
Разве так нельзя?

-~{}~ 18.01.05 09:23:

Да, почитал http://www.pyaticom.ru/article/004/ и понял что малось ошибся. В прикладном программировании все проще за счет возможности сохранения уже полученного дерева.
Извиняюсь за мой пост выше.
 

-faqer-

Я только учусь
Почти сутки прошли, а мне так никто и не дал четкого ответа
Я вас очень прошу, подмогните
 

-faqer-

Я только учусь
Спасибо, правда никогда не понимал, зачем столько эмоций.

Чуть выше (если внимательно посмотреть) я несколько раз редактировал свой пост и вчера ночью дошел до решения проблемы. И собственно и спрашивал, можно ли как-то лаконичнее, вот мне Vladax ссылку и подкинул
Еще раз спасибо
 

vladax

Новичок
Лаконично здесь представлена только идея. Один хрен никуда ты не денешься от собирания в цикле, как ты выразился, "вот такого вот мутного условия" :)

Хотя "условие" твое и вправду было мутноватым :)
c_id = ".$row ['c_id'] - действительно лишее условие, а предложение с BETWEEN гораздо лучше и короче твоего
c_left > ".$row ['c_left']." AND c_right < ".$row ['c_right']
Ну, разобрался, и слава Богу :)
 
Сверху