MySQL8允許使用with語法來查詢分層結構。例如,查詢一個專案的所有祖先。反之,也可以遞回地查詢所有的后裔。
我正在尋找一個結合這兩個方面的查詢:查詢所有的后代、祖先,最好是查詢專案本身(見所附圖形,所有著色的專案)。實際上,你也可以說,所有專案沒有所有祖先的兄弟姐妹。我想我們可以說 "血統"。有可能只是將兩個結果union,但我需要一個沒有union的解決方案。
這到底有沒有可能?我將歡迎任何方法。
概述一下,我的聯盟嘗試。請注意,目前有一個錯誤,一些parent_id是錯誤的;我正在努力解決這個問題)
我的聯合嘗試。
(with recursive cte as (
SELECT id, parent_id
from categories
where id = 'C2'/span>
union all
select t.parent_id, cte.id
from cte
inner join categories t on t.id = cte.parent_id
where cte.id is not nullselect id, parent_id
from cte
where cte.id is not null)
union
(with recursive cte as (
SELECT id, parent_id
from categories
where id = 'C2'/span>
union all
select t.id, cte.parent_id
from cte
inner join categories t on t.parent_id = cte.id
)
select id, parent_id
from cte)。)
和給定圖表的資料。
INSERT INTO categories (id, parent_id) VALUES ('A1', null) 。
INSERT INTO categories (id, parent_id) VALUES ('B1', 'A1')。
INSERT INTO categories (id, parent_id) VALUES ('B2'/span>, 'A1'/span>) 。
INSERT INTO categories (id, parent_id) VALUES ('B3', 'A1')。
INSERT INTO categories (id, parent_id) VALUES ('C1', 'B2')。
INSERT INTO categories (id, parent_id) VALUES ('C2'/span>, 'B2'/span>) 。
INSERT INTO categories (id, parent_id) VALUES ('D1'/span>, 'C1'/span>) 。
INSERT INTO categories (id, parent_id) VALUES ('D2'/span>, 'C1'/span>);
INSERT INTO categories (id, parent_id) VALUES ('D3'/span>, 'C2'/span>) 。
INSERT INTO categories (id, parent_id) VALUES ('D4'/span>, 'C2'/span>);
INSERT INTO categories (id, parent_id) VALUES ('D5'/span>, 'C2'/span>) 。
INSERT INTO categories (id, parent_id) VALUES ('E1', 'D5')。
預期輸出
id, parent_id
C2,B2
A1,null[/span
B2,A1
D3,C2
D4,C2
D5,C2
E1,D5
uj5u.com熱心網友回復:
你可以用1個遞回CTE來做,如果你在ON子句中包括祖先和后代的兩個條件。
你將需要另一個列type來指示每一行是祖先還是后代:
WITH RECURSIVE cte AS (
SELECT id, parent_id, 0 type
FROM 類別
WHERE id ='C2'
UNION ALL
SELECT t.id, t.parent_id。
CASE WHEN c.parent_id = t. id THEN -1 ELSE 1 END
FROM categories t INNER JOIN cte c
ON c.parent_id = t.id OR c.id = t.parent_id
WHERE (type = 0)
OR (c.parent_id = t.id AND type = -1)
OR (c.id = t.parent_id AND type = 1)
)
SELECT id, parent_id FROM cte
請看demo。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/319302.html
標籤:

