簡體   English   中英

您能否在一個查詢中從同一個表中提取所有父子關系列,同時保持正確的順序?

[英]Can you pull all parent-child relation columns from the same table in one query while keeping the right order?

CREATE TABLE messages (
    id int,
    text varchar(255),
    parent int NULL
);

insert into messages (id, text, parent) values 
(1, 'Parent message 1', NULL),
(2, 'Parent message 2 ', NULL),
(3, 'Parent message 3', NULL),
(4, 'Child 1 of parent one', 1),
(5, 'Child 1 of of child', 4),
(6, 'child 2 of parent 2', 2),
(7, 'child 3 of parent 4', 3);

[SQL 小提琴][1]

[1]: http://sqlfiddle.com/#!9/fca7240/1我也在我的項目中保存日期

我有一個簡單的表,它具有父子關系,其中父母可以有多個孩子,孩子也可以有 N 個孩子。

我知道如何通過首先拉動父母並為每個父母消息發出另一個 Ajax 請求來在后端執行此操作,然后他們遞歸地獲取所有孩子。

但我不知道如何或是否可以在 SQL 中做到這一點,所以我不必為每個有孩子的父母提出另一個要求,也不必保持正確的順序。 就像人們可以互相回復的留言板或評論場景。

是否可以在一次查詢中保持正確順序的同時查詢所有父母及其子女?

-- Parent Message
---- Reply to parent
------'later another message gets inserted here so I can't order by id'
---- Reply to replay
-- Parent Message
---- Reply

我知道如何通過多次旅行遞歸地做到這一點,但我不知道如何在一個查詢中做到這一點。

WITH RECURSIVE
cte AS ( SELECT id, text, parent, CAST(LPAD(id, 6, '0') AS CHAR(65535)) path
         FROM messages
         WHERE parent IS NULL 
       UNION ALL
         SELECT messages.id, messages.text, messages.parent, CONCAT(cte.path, LPAD(messages.id, 6, '0'))
         FROM cte
         JOIN messages ON cte.id = messages.parent )
SELECT id, text, parent
FROM cte
ORDER BY path

演示

需要 MySQL 8 或 MariaDB 10.2.2。

PS。 LPAD 中指定的長度(我的查詢中為 6)取決於最大id值長度(必須不少於)。

聚苯乙烯。 對於 MariaDB - 測試,非遞歸 CTE 部分中的 CAST 可能是多余的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM