Php 自连接树MYSQL

Php 自连接树MYSQL,php,jquery,mysql,tree,self-join,Php,Jquery,Mysql,Tree,Self Join,这是我的分类表 category_id | parent_id ____________________________ 27 | 25 28 | 27 29 | 25 26 | 28 25 | 0 30 | 0 31 | 26 .......... ........

这是我的分类表

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:

或者类似的

因为MySQL还没有对递归†的本机支持,这变得有点过分了,因此替代模型的流行,例如嵌套集


†MySQL 8.0将增加对的支持。

我不明白您试图实现的目标。您以这种方式获取数据的逻辑是什么
27
29
具有相同的
父id 25
,为什么
29
31
之后?看起来您只想以不同的顺序排序结果?除顺序外,上述两个结果没有差异?但我不知道那是什么顺序。。。?表中还有更多的列吗?什么叫“像这样”?你需要解释一下。@BillKarwin-哦,伙计,现在我得去学一大堆新东西了!
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 |
+-------------+-----------+
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 |
+-------------+-----+-----+