Прошу в помощи в написании mysql запросов для вывода категорий-субкатегорий

artalex
На сайте с 08.12.2005
Offline
144
801

Добрый день всем. Столкнулся с задачей, которую не могу никак реализовать. Прошу помощи.

Есть таблица в бд.

Поля таблицы:

id,name,parentId,children

id = идентификатор категории (раздела каталога)

name = название раздела каталога

parentId = идентификатор родительского раздела каталога (для разделов самого верхнего уровня – «0»)

children = для разделов самого верхнего уровня поле не заполняется; для разделов промежуточного уровня содержит список идентификаторов дочерних разделов низшего уровня; для разделов низшего уровня содержит собственный идентификатор

Необходимо вывести строки в виде многоуровневого списка (UL), с учетом вложенных категорий.

При этом, конечно, нужно не положить мускуль запросами :)

Joker-jar
На сайте с 26.08.2010
Offline
167
#1

Создал таблицу:

mysql> create table test (id integer primary key auto_increment, name text, parentid integer, children text);

Query OK, 0 rows affected (0.49 sec)

Занес значения:

mysql> insert into test(name, parentid, children) values('корень 1', 0, ''), ('подкатегория', 1, '5,6,7'), ('корень 2', 0, ''), ('еще подкатегория', 3, '8,9,10'), ('пять', 2, '5'), ('шесть', 2, '6'), ('семь', 2, '7'), ('восемь', 4, '8'), ('девять', 4, '9'), ('десять', 4, 10);

Query OK, 10 rows affected (0.00 sec)
Records: 10 Duplicates: 0 Warnings: 0

Получилось вот что:

mysql> select * from test;

+----+---------------------------------+----------+----------+
| id | name | parentid | children |
+----+---------------------------------+----------+----------+
| 1 | корень 1 | 0 | |
| 2 | подкатегория | 1 | 5,6,7 |
| 3 | корень 2 | 0 | |
| 4 | еще подкатегория | 3 | 8,9,10 |
| 5 | пять | 2 | 5 |
| 6 | шесть | 2 | 6 |
| 7 | семь | 2 | 7 |
| 8 | восемь | 4 | 8 |
| 9 | девять | 4 | 9 |
| 10 | десять | 4 | 10 |
+----+---------------------------------+----------+----------+
10 rows in set (0.00 sec)

Далее, список категорий с подкатегориями можно получить следующим образом:

mysql> select tab1.id, tab1.name, tab2.id, tab2.name, tab2.children from test as tab1 left join test as tab2 on (tab1.parentid = 0 and tab2.parentid = tab1.id) where tab1.parentid = 0;

+----+----------------+------+---------------------------------+----------+
| id | name | id | name | children |
+----+----------------+------+---------------------------------+----------+
| 1 | корень 1 | 2 | подкатегория | 5,6,7 |
| 3 | корень 2 | 4 | еще подкатегория | 8,9,10 |
+----+----------------+------+---------------------------------+----------+
2 rows in set (0.00 sec)

а список категорий последнего уровня по циклу для каждой записи так:

select * from test where id in ($ids);

где $ids - значение последнего столбца в предыдущем результате. Например:

mysql> select * from test where id in (5,6,7);

+----+------------+----------+----------+
| id | name | parentid | children |
+----+------------+----------+----------+
| 5 | пять | 2 | 5 |
| 6 | шесть | 2 | 6 |
| 7 | семь | 2 | 7 |
+----+------------+----------+----------+
3 rows in set (0.00 sec)
J
На сайте с 20.07.2010
Offline
72
#2

Для работы с древовидными данными в mysql есть хорошая статья

http://dev.mysql.com/tech-resources/articles/hierarchical-data.html

Вам посоветую сделать так:

Выбираете ВСЕ данные из таблицы категорий. Пишете рекурсивную функцию, которая

определяет уровни для конкретного элемента, добавляет индекс уровня вложенности "level" (0,1,2,3..) к каждому из них. Далее упорядочиваете согласно уровня и выводите.

Joker-jar
На сайте с 26.08.2010
Offline
167
#3

В таком случае, лучше всю вложенность возложить на индексы id и parentid, избавившись от children. У меня на работе на разрабатываемом мной корпоративном сайте телефонный справочник имеет древовидную структуру, имеется php-функция, строящая по данным из таблицы древовидный ассоциативный php-массив, если нужно, поделюсь

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий