mysql - 如何在 mysql 查询中列出父项之后的子项

标签 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

先谢谢了:)

最佳答案

这里的技巧是确定自定义排序参数。它的 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 

为了代码的可读性和易懂性,我在Select子句中计算了custom_sort_parameter。但是您可以将其改为 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

关于mysql - 如何在 mysql 查询中列出父项之后的子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53098248/

相关文章:

mysql - 用于查找共享完全相同的一组值的对的 SQL 查询

按日期查询销售报告的SQL

mysql - 为什么如果我在 WHERE 子句中再添加一个条件,那么使用索引就会失败?

c# - 如何在插入记录时使用存储过程防止 SQL 注入(inject)?

mysql - 使用 Now() 作为 MySql DateTime 类型的默认值

php - 在插入 mysql 之前格式化 float

mysql - 为什么 Mysql 不能像 NoSQL 那样具有可扩展性?

c++ - 将行插入非空表时出现 mySql 连接器异常(mysql 的 C++ 库)

mysql - 规范化表、SQL 连接和 View

sql - 迁移到云数据库