MySql Recursive - 从给定的id获取所有 child 和 parent

标签 mysql sql common-table-expression hierarchical-data recursive-query

MySQL 8.0 版 架构 SQL

CREATE TABLE IF NOT EXISTS `department` (
  `id` INT NOT NULL,
  `name` VARCHAR(45) NOT NULL,
  `father` INT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_department_department_idx` (`father` ASC) VISIBLE,
  CONSTRAINT `fk_department_department`
    FOREIGN KEY (`father`)
    REFERENCES `department` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

insert into department (id,name,father)
values
(1, 'dp1',null),
(2, 'dp2',null),
(3, 'dp3',1),
(4, 'dp4',1),
(5, 'dp5',2),
(6, 'dp6',4),
(7, 'dp7',6),
(8, 'dp8',6),
(9, 'dp9',6);

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
SET SESSION sql_mode = '';

我的查询:

WITH RECURSIVE cte_department AS (
      SELECT 
          d1.id, 
          d1.name, 
          d1.father
      FROM
          department d1
      WHERE
          d1.id=6
    UNION ALL
      SELECT 
          d2.id, 
          d2.name, 
          d2.father
      FROM
          department d2
      INNER JOIN cte_department cte ON cte.id = d2.father
)
SELECT * FROM cte_department;

结果:

id  name    father
6   dp6      4
7   dp7      6
8   dp8      6
9   dp9      6

我需要什么:

id  name    father
1   dp1      null
4   dp4      1
6   dp6      4
7   dp7      6
8   dp8      6
9   dp9      6

问题是: 我可以获取所有 child ,但我需要将给定 ID 中的所有 parent 添加到此查询中,在本例中为 ID 6。 我坚持这一点。如果有人可以帮助我,请跟随 fiddle 。

https://www.db-fiddle.com/f/g8YkE3hqsvaw8G9vdHPyyF/0

最佳答案

递归部分可以有多个查询 block 。

WITH RECURSIVE cte_department AS (
      SELECT 
          d1.id,
          d1.name,
          d1.father,
          'Begin' state
      FROM
          department d1
      WHERE
          d1.id=6
    UNION ALL
      SELECT 
          d2.id,
          d2.name,
          d2.father,
          'Up'
      FROM
          department d2
      INNER JOIN
          cte_department cte
      ON
          cte.father = d2.id
      WHERE
          cte.state in ('Begin', 'Up')
    UNION ALL
      SELECT 
          d2.id,
          d2.name,
          d2.father,
          'Down'
      FROM
          department d2
      INNER JOIN
          cte_department cte
      ON
          cte.id = d2.father
      WHERE
          cte.state in ('Begin', 'Down')
)
SELECT
    id, name, father
FROM
    cte_department
ORDER BY
    father, id, name;

试用 db<>fiddle .

关于MySql Recursive - 从给定的id获取所有 child 和 parent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65377583/

相关文章:

sql - 杀死mysqld进程

MySQL:CONCAT/SUBSTRING:这不起作用,因为我使用的是 int 变量吗?

sql - "With"关键字在 SQL 中是如何工作的?

mysql - 我不明白 mysql 语法有什么问题

javascript - Morris 图表和 PHP 问题

mysql - Rails/MySQL 查询,其中第三级连接 ID 不存在

performance - 如何在子查询因子临时表上创建索引?

sql - 'exists' 相关子查询中递归 CTE 的替代方案?

mysql - 使用 2 个不同的 WHERE 对 1 进行 2 次查询

sql - 如果 child 不存在,则删除父记录