Đây là một single-truy vấn MySql-giải pháp đơn giản:
SELECT GROUP_CONCAT(Level SEPARATOR ',') FROM (
SELECT @Ids := (
SELECT GROUP_CONCAT(`ID` SEPARATOR ',')
FROM `table_name`
WHERE FIND_IN_SET(`parent_id`, @Ids)
) Level
FROM `table_name`
JOIN (SELECT @Ids := <id>) temp1
) temp2
Chỉ cần thay <id>
với yếu tố phụ huynh của ID
.
Điều này sẽ trả về một chuỗi với ID
s của tất cả các hậu duệ của phần tử có ID
= <id>
, được phân tách bằng ,
. Nếu bạn muốn có nhiều hàng trở lại, với một hậu duệ trên mỗi hàng, bạn có thể sử dụng một cái gì đó như thế này:
SELECT *
FROM `table_name`
WHERE FIND_IN_SET(`ID`, (
SELECT GROUP_CONCAT(Level SEPARATOR ',') FROM (
SELECT @Ids := (
SELECT GROUP_CONCAT(`ID` SEPARATOR ',')
FROM `table_name`
WHERE FIND_IN_SET(`parent_id`, @Ids)
) Level
FROM `table_name`
JOIN (SELECT @Ids := <id>) temp1
) temp2
))
Bao gồm các phần tử gốc/mẹ
Các OP hỏi cho trẻ em của một phần tử được trả lời ở trên. Trong một số trường hợp, có thể hữu ích khi đưa phần tử gốc/phần tử gốc vào kết quả. Dưới đây là các giải pháp đề nghị của tôi:
bằng dấu phẩy tách chuỗi id:
SELECT GROUP_CONCAT(Level SEPARATOR ',') FROM (
SELECT <id> Level
UNION
SELECT @Ids := (
SELECT GROUP_CONCAT(`ID` SEPARATOR ',')
FROM `table_name`
WHERE FIND_IN_SET(`parent_id`, @Ids)
) Level
FROM `table_name`
JOIN (SELECT @Ids := <id>) temp1
) temp2
Nhiều hàng:
SELECT *
FROM `table_name`
WHERE `ID` = <id> OR FIND_IN_SET(`ID`, (
SELECT GROUP_CONCAT(Level SEPARATOR ',') FROM (
SELECT @Ids := (
SELECT GROUP_CONCAT(`ID` SEPARATOR ',')
FROM `table_name`
WHERE FIND_IN_SET(`parent_id`, @Ids)
) Level
FROM `table_name`
JOIN (SELECT @Ids := <id>) temp1
) temp2
))
Có một cách để có đệ quy trong một truy vấn SQL đơn giản trong RDBMS có hỗ trợ nó, như PostgreSQL – shesek
Trang web trả lại liên kết này không có sẵn – HMagdy