【问题标题】:how to retrieve hierarchical data retrieved as a collection如何检索作为集合检索的分层数据
【发布时间】:2013-07-02 08:23:24
【问题描述】:

我已经使用 MySQL 实现了以下分层数据

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

【问题讨论】:

标签: mysql hierarchy hierarchical-data


【解决方案1】:

尝试按 desc 包含订单

 ORDER by path desc,id asc

【讨论】:

    【解决方案2】:

    为了应付父母/孩子可能是这样的:-

    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,因为它大于路径中最大的单个值。

    【讨论】:

      猜你喜欢
      • 2012-06-29
      • 2012-10-15
      • 1970-01-01
      • 2013-09-05
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多