0

親のすべての子を取得するためのクエリ (+php) がありますが、それをひっくり返して、要素のすべての親を取得する方が便利です。

テーブル:

ID     parentID     showOrder
===============================
1      0            0
2      1            0
3      2            0
4      3            1
5      3            2
6      3            3

コード:

<?php
$structure = array();
$sql = "SELECT ID, parentID FROM table ORDER BY parentID ASC, showOrder ASC";
while ($row = fetch_row()) {
  $structure[$row['parentID']][] = $row['ID'];
}

出力:

0: [1], 1: [2], 2: [3], 3: [5,4,6]

望ましい結果:

0: [], 1: [0], 2: [1, 0], 3: [2, 1, 0],
4: [3, 2, 1, 0], 5: [3, 2, 1, 0], 6: [3, 2, 1, 0]

これどうやってするの?

4

2 に答える 2

0

階層的なクエリ ドメインに陥っています。

Oracle は非常に便利な処理方法 (CONNECT BY節) を提供していますが、mysql は提供していません。

このリンクhttp://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/をたどると、純粋な mysql を通じて目標を達成する方法が説明されます。

php のみで実行したい場合は、それも可能ですが、エンジンが切り替わるため (php/mysql 間の通信: クエリの呼び出し、php への復帰など)、何度も繰り返した後にコストがかかる可能性があるため、どういうわけか非効率的です。 .

rgds。

于 2012-06-18T01:43:04.427 に答える
0

親が常に順番に並んでいる場合は、祖先の配列を次のように保持できます。

// initialize as empty
$ancestors = array();
while ($row = fetch_row()) {
    $ancestors[$row['id']] = array($row['parentid'] => $row['parentid']);
    // if the parent exists
    if (isset($ancestors[$row['parentid']])) {
        // grow ancestors by parent's ancestors
        $ancestors[$row['id']] += $ancestors[$row['parentid']];
    }
}

出力:

Array
(
    [1] => Array
        (
            [0] => 0
        )

    [2] => Array
        (
            [1] => 1
            [0] => 0
        )

    [3] => Array
        (
            [2] => 2
            [1] => 1
            [0] => 0
        )

    [4] => Array
        (
            [3] => 3
            [2] => 2
            [1] => 1
            [0] => 0
        )

    [5] => Array
        (
            [3] => 3
            [2] => 2
            [1] => 1
            [0] => 0
        )

    [6] => Array
        (
            [3] => 3
            [2] => 2
            [1] => 1
            [0] => 0
        )

)
于 2012-06-18T02:02:22.513 に答える