Mysql 如何检索作为集合检索的分层数据
我已经使用MySQL实现了以下分层数据Mysql 如何检索作为集合检索的分层数据,mysql,hierarchy,hierarchical-data,Mysql,Hierarchy,Hierarchical Data,我已经使用MySQL实现了以下分层数据 1 |----- 2 |----- 3 4 |----- 5 |----- 6 |----- 7 id | path | level | parent_id | content | ------------------------------------------------------------------- 1 1 1
1
|----- 2
|----- 3
4
|----- 5
|----- 6
|----- 7
id | path | level | parent_id | content |
-------------------------------------------------------------------
1 1 1 NULL xxx
2 1:2 2 1 yyy
3 1:3 2 1 abc
4 4 1 NULL zzz
5 4:5 2 4 yyy
6 4:6 2 4 abc
7 4:6:7 3 6 abc
假设我只有这些记录,
如何在一个树结构中检索它们,而在从最后一棵树开始的单个集合中检索它们
我期望从查询或存储过程中得到的是按以下顺序返回给我
id
-----
4
5
6
7
1
2
3
我如何做同样的事情,但从第一棵树开始
id
-----
1
2
3
4
5
6
7
尝试按描述包含订单
ORDER by path desc,id asc
为了应付父母/孩子,可能会这样:-
SELECT PathTable.*, SUM(OrderVal) AS OrderCalc
FROM
(
SELECT id,
POW(100, MaxDepth-i-1) * SUBSTRING_INDEX(SUBSTRING_INDEX(path, ':', (i+1)), ':', -1) AS OrderVal
FROM PathTable
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Sub1
CROSS JOIN (SELECT MAX(LENGTH(path) - LENGTH(REPLACE(path, ':', ''))) + 1 AS MaxDepth FROM PathTable) Sub2
WHERE i <= (LENGTH(path) - LENGTH(REPLACE(path, ':', '')))
) Sub1
INNER JOIN PathTable
ON Sub1.id = PathTable.id
GROUP BY PathTable.id
ORDER BY OrderCalc
这是对路径字段进行拆分,并根据路径位级别的幂100计算一个顺序值,考虑到路径的最大位数乘以该路径位,因此4:6:7为7+6*100^1+4*100^2,然后按该顺序排序
选择100,因为它大于路径中最大的单个值。可能是重复的: