同表中的父子排序

Irf*_*fan 5 mysql sql

我有一张这样的桌子——

id  name        ordering    catid 
1   parent1         1         0
2   parent2         2         0
3   parent3         3         0
4   child11         1         1
5   child12         2         1
6   child21         1         2
7   child22         2         2
8   child31         1         3
9   child32         2         3
Run Code Online (Sandbox Code Playgroud)

我试图得到如下结果-

id  name        ordering    catid 
1   parent1         1         0
4   child11         1         1
5   child12         2         1
2   parent2         2         0
6   child21         1         2
7   child22         2         2
3   parent3         3         0
8   child31         1         3
9   child32         2         3
Run Code Online (Sandbox Code Playgroud)

我想订购第一个而parent(catid=0)不是它的孩子而不是第二个父母和它的孩子。这是否可以通过这些列实现预期结果。我尝试加入但没有成功。当然,我没有正确地做到这一点。这是我尝试过的-

SELECT a.*,c.name AS category_title FROM table AS a 
LEFT JOIN table AS c ON c.id = a.catid 
ORDER BY c.ordering asc, a.ordering asc
Run Code Online (Sandbox Code Playgroud)

Vik*_*dor 5

该查询将SELF JOIN在同一个表上执行 a ,方法是将第一个表中的记录与相应的父记录连接起来。如果父级存在,则列 parentId 将包含记录的父级 ID,否则为记录本身的 ID。然后按 parentId 和 ID 对结果进行排序,以便父项始终显示在给定的父项及其子项组的顶部。

SELECT
    m.id, 
    m.name, 
    m.catid, 
    m.ordering, 
    p.ordering,
    case 
        WHEN p.ordering IS NULL THEN m.ordering * 10
        ELSE m.ordering + p.ordering * 10
    END AS parentId
FROM
    MyTable m
    LEFT JOIN MyTable p
    ON m.catid = p.id
ORDER BY parentId
Run Code Online (Sandbox Code Playgroud)

结果如下:

1   parent1 0   1       10
4   child11 1   1   1   11
5   child12 1   2   1   12
2   parent2 0   2       20
6   child21 2   1   2   21
7   child22 2   2   2   22
3   parent3 0   3       30
8   child31 3   1   3   31
9   child32 3   2   3   32
Run Code Online (Sandbox Code Playgroud)