如何在mysql查询中在父级后列出子级

时间:2018-11-01 09:16:52

标签: mysql sql

我在mysql表中有这样的数据

id ||  act  || parent || level
1  ||   13  ||  0     ||  1
2  ||   13  ||  0     ||  1 
3  ||   13  ||  1     ||  2
4  ||   13  ||  2     ||  2
5  ||   13  ||  1     ||  2

如果我想要这样的结果,如何在mysql中查询:

id ||  act  || parent || level
1  ||   13  ||  0     ||  1
3  ||   13  ||  1     ||  2 
5  ||   13  ||  1     ||  2
2  ||   13  ||  0     ||  1
4  ||   13  ||  2     ||  2

谢谢:)

1 个答案:

答案 0 :(得分:1)

这里的技巧是确定自定义排序参数。 parent的值为0,我们可以简单地使用该行的id的值;否则为parent值。这是因为其他级别的parent值与父级的id行相同。

我们还将使用多级Order By,第二级排序使用id

您可以执行以下操作:

SELECT 
  id, 
  act, 
  parent, 
  level, 
  (CASE WHEN parent = 0 THEN id ELSE parent END) AS custom_sort_parameter 
FROM 
  your_table_name 
ORDER BY custom_sort_parameter, id 

为了便于阅读和易于理解,我在custom_sort_parameter子句中完成了Select的计算。但是您可以改为将其移到Order By子句中(以避免再获得一个不必要的列)。它显示在下面的演示中。


模式(MySQL v5.7)

Create table your_table_name 
(id int, act int, parent int, level int);

Insert into your_table_name 
VALUES (1,13,0,1), 
       (2,13,0,1), 
       (3,13,1,2), 
       (4,13,2,2), 
       (5,13,1,2);

查询#1

SELECT 
  id, 
  act, 
  parent, 
  level
FROM 
  your_table_name 
ORDER BY 
  CASE 
    WHEN parent = 0 THEN id 
    ELSE parent 
  END 
  , id;

| id  | act | parent | level |
| --- | --- | ------ | ----- |
| 1   | 13  | 0      | 1     |
| 3   | 13  | 1      | 2     |
| 5   | 13  | 1      | 2     |
| 2   | 13  | 0      | 1     |
| 4   | 13  | 2      | 2     |

View on DB Fiddle