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