Самостоятельное присоединение дерева MYSQL

Вот моя таблица категорий

category_id | parent_id
____________________________
27   |       25
28   |       27
29   |       25
26   |       28
25   |        0
30   |        0
31   |       26
..........
..........

Я хочу показать записи, как это.

   category_id  | parent_id
____________________________
25  |        0
27  |       25
28  |       27
26  |       28
31  |       26
29  |       25
30  |        0

..........
..........

Я видел много сообщений об этом, но я ничего не нахожу для себя.
Пожалуйста, дайте мне знать запрос для моей таблицы категорий. Благодарю.
Вот несколько ссылок, которые я уже посмотрел.
1:
введите описание ссылки здесь
2: введите описание ссылки здесь

-2

Решение

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(category_id INT NOT NULL
,parent_id INT NULL
);

INSERT INTO my_table VALUES
(27,25),
(28,27),
(29,25),
(26,28),
(25,NULL),
(30,NULL),
(31,26);

SELECT DISTINCT t1.*
FROM my_table t1
LEFT
JOIN my_table t2
ON t2.parent_id = t1.category_id
LEFT
JOIN my_table t3
ON t3.parent_id = t2.category_id
LEFT
JOIN my_table t4
ON t4.parent_id = t3.category_id
ORDER
BY t4.parent_id DESC
, t3.parent_id DESC
, t2.parent_id DESC
, t1.parent_id DESC;

+-------------+-----------+
| category_id | parent_id |
+-------------+-----------+
|          25 |      NULL |
|          27 |        25 |
|          28 |        27 |
|          26 |        28 |
|          31 |        26 |
|          29 |        25 |
|          30 |      NULL |
+-------------+-----------+

или что-то типа того.

Поскольку MySQL еще не имеет встроенной поддержки рекурсии, это становится немного глотком, отсюда и популярность альтернативных моделей, например вложенный набор

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(category_id INT NOT NULL
,lft INT NOT NULL
,rgt INT NOT NULL
);

INSERT INTO my_table VALUES
(0,1,16),
(25,2,13),
(27,3,10),
(28,4,9),
(26,5,8),
(31,6,7),
(29,11,12),
(30,14,15);

SELECT * FROM my_table ORDER BY lft;
+-------------+-----+-----+
| category_id | lft | rgt |
+-------------+-----+-----+
|           0 |   1 |  16 |
|          25 |   2 |  13 |
|          27 |   3 |  10 |
|          28 |   4 |   9 |
|          26 |   5 |   8 |
|          31 |   6 |   7 |
|          29 |  11 |  12 |
|          30 |  14 |  15 |
+-------------+-----+-----+

MySQL 8.0 добавит поддержку рекурсивный синтаксис CTE.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]