Выборка один запросом

  • Автор темы Intelligent
  • Дата начала

Intelligent

Guest
Выборка один запросом

Есть таблица с такой структурой:

Код:
+---------------+---------------------+------+-----+---------+----------------+
| Field         | Type                | Null | Key | Default | Extra          |
+---------------+---------------------+------+-----+---------+----------------+
| id            | int(6) unsigned     |      | PRI | NULL    | auto_increment |
| parent        | int(6) unsigned     |      |     | 0       |                |
| position      | tinyint(4) unsigned |      |     | 0       |                |
| title         | varchar(255)        |      |     |         |                |
+---------------+---------------------+------+-----+---------+----------------+
* position - позиция (порядок отображения) относительно разделов того же уровня


В общем случае это дерево каталогов уровень вложенности которого не превышает 2
Можно ли как нибудь одним запросом сформировать список разделов с учетом параметра position, т.е. что-то вроде этого:

Раздел_1
Подраздел_1
Подраздел_2
Подраздел_3
Раздел_2
Раздел_3
Подраздел_1
Подраздел_2
 

Кром

Новичок
В разделе статьи есть пару статей про деревья. Ты их уже читал?
 

Intelligent

Guest
да я читал, но в данном случае вложенность дерева всегда будет не более 2-x, не хочется использовать nested sets или какие либо другие методы хранения деревьев в БД в подобном случае
 

camka

не самка
Делай JOIN таблицы с самой собой и сортируй соответствующе. Получешь именно то, что тебе и надо.
 

akxxiv

Новичок
Если уровень вложенности не привышает 2-х, то не легче ли сделать двойной индекс по parent и id, а при выборке сортировать по нему?
 

robocomp

Новичок
Так-так, мущщино, существует решение вашей проблемы для деревьев любой вложенности

-~{}~ 06.07.05 10:41:

Итак, вернёмся к алгоритмам для программистов ПХП. Возможно я не до конца прочитал вопрос, но, ответить мне хочется сильно.
Выступить, так сказать.
Итак, если я не тупица, то вы спрашиваете, значит, как одним запросом вывести иерархию древовидную, да?
Например, дерево категорий там?
Ну что же, существует по крайней мере вагон и маленькая тележка вариантов.
1. сменить СУБД. Оракул позволяет делать иерархические запросы. И счастье будет
2. способ один, согласитесь, не очень блестящ, да? Поэтому есть вот такой вот способ:
ЗДесь пишут много о том, почему стоит лишний раз подумать о создании такой структуры (http://axapta.mazzy.ru/lib/tree2/)
В общем, ссылку там искать долго, капец, я офигел.
Но суть проблемы такова
создаём таблицу

create table tree (
node_id int(10) unsigned not null auto_increment,
parent_node_id int(10) unsigned not null references tree,
thread_id int(10) unsigned not null references tree,
level smallint unsigned not null default 0,
sequence smallint unsigned not null default 0,
name char(100),
primary key(node_id),
key (parent_id),
key (thread_id),
unique key (thread_id, sequence)
);

Где:
такие поля, как noe_id, parent_id -- ясны, верно?
далее, thread_id -- это номер ветви сообщения, ссылашющийся на node_id корневого элемента этой ветви (у всех собщений ветви одинаковый)
level - уровень сообщения в ветви.
sequence - номер следования сообщения в ветви



постороить дерево можно таким запросом

select concat(rpad(chr(32),level),name)) node from tree
order by thread_id,sequence;

Разумеется, все эти поля надо поддерживаться при добавлении, что, разумеется, замедляет вставки.

Но судя по моему опыту вставки здесь как раз не самые часто выполняемые операции

-~{}~ 06.07.05 10:42:

Да, если я ответил не на тот вопрос -- извините -)
выступить на эту тему очень хотелось -))
 
Сверху