Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 基于特定条件仅返回树的一条路径_Mysql_Recursive Query - Fatal编程技术网

Mysql 基于特定条件仅返回树的一条路径

Mysql 基于特定条件仅返回树的一条路径,mysql,recursive-query,Mysql,Recursive Query,鉴于此表: CREATE TABLE customer ( id int, parentid int, name nvarchar(10) ) INSERT customer VALUES(1, NULL, 'aaa'), (2, 1, 'bbb'), (3, 2, 'ccc'), (4, 2, 'ddd'), (5, 1, 'eee'), (6, 5, 'fff'),

鉴于此表:

CREATE TABLE customer
 (
  id int,
  parentid int,
  name nvarchar(10)
  )

INSERT customer
VALUES(1,  NULL, 'aaa'),
      (2,  1,    'bbb'),
      (3,  2,    'ccc'),
      (4,  2,    'ddd'),
      (5,  1,    'eee'),
      (6,  5,    'fff'),
      (7,  5,    'ggg'),
      (8,  1,    'hhh'),
      (9,  8,    'iii'),
      (10, 8,    'jjj')
对于特定id,我需要分支的一条路径,而不是整个分支。例如,这将返回特定id的所有子级:

DECLARE @Id int = your_UnitId
;WITH cte AS 
 (
  SELECT a.Id, a.parentId, a.name
  FROM customer a
  WHERE Id = @Id
  UNION ALL
  SELECT a.Id, a.parentid, a.Name
  FROM customer a JOIN cte c ON a.parentId = c.id
  )
  SELECT parentId, Id, name
  FROM cte
演示


例如,我希望在_UnitId为1时返回带有“aaa”、“hhh”、“jjj”的行,因为单个分支的id最高。('hhh'的id是其兄弟姐妹中最高的,'jjj'的id是其兄弟姐妹中最高的)。

首先,您必须删除工作表上的一些客户,以便只保留长子。然后可以使用递归CTE。不能在递归CTE中筛选客户

DECLARE @Id int = 1

;with biggest_customer as
(
Select Id = max(a.Id), ParentId = a.parentId  
FROM customer a 
group by a.parentId
UNION
Select Id = a.Id, ParentId = a.parentId FROM customer a where a.ID = @ID   
),

biggest_customer_name as
(
select b.*, c.name from biggest_customer b inner join customer c on b.ID=c.ID
),

cte AS 
(
SELECT a.Id, a.parentId, a.name
FROM biggest_customer_name a
WHERE Id = @Id
UNION ALL
SELECT a.Id, a.parentid, a.Name
FROM biggest_customer_name a JOIN cte c ON a.parentId = c.id

)
SELECT parentId, Id, name
FROM cte

首先,为了只保留长子,你必须删除工作台上的一些客户。然后可以使用递归CTE。不能在递归CTE中筛选客户

DECLARE @Id int = 1

;with biggest_customer as
(
Select Id = max(a.Id), ParentId = a.parentId  
FROM customer a 
group by a.parentId
UNION
Select Id = a.Id, ParentId = a.parentId FROM customer a where a.ID = @ID   
),

biggest_customer_name as
(
select b.*, c.name from biggest_customer b inner join customer c on b.ID=c.ID
),

cte AS 
(
SELECT a.Id, a.parentId, a.name
FROM biggest_customer_name a
WHERE Id = @Id
UNION ALL
SELECT a.Id, a.parentid, a.Name
FROM biggest_customer_name a JOIN cte c ON a.parentId = c.id

)
SELECT parentId, Id, name
FROM cte