Вот моя таблица категорий
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: введите описание ссылки здесь
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.
Других решений пока нет …