0

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
4

2 に答える 2

0

おそらくこのような親/子供に対処するには:-

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 乗した値に基づいて順序値を計算します。 7 + 6 * 100^1 + 4 * 100^2) となり、それによって順序付けされます。

パス内の最大の単一値よりも大きいため、100 が選択されました。

于 2013-07-02T09:14:11.610 に答える