0

単一のテーブルに対してクエリを作成する必要があります。次のようなテーブル構造とその中のいくつかのダミーデータ

id  | username  | seniorid
1   | Superuser |   -1
2   | user1 |    1
3   | user2 |    1
4   | user3 |    3
5   | user4 |    4
6   | user5 |    1
7   | user6 |    6
8   | user7 |    6
9   | user8 |    8
10  | user9 |    9
11  | user10    |    8
12  | user11    |    8
13  | user12    |    8
14  | user13    |    6
15  | user14    |    3
16  | user15    |    2
17  | user16    |    8
18  | user17    |    8

上記の表では、スーパーユーザーは 1 人だけです。これは、ユーザー階層のトップ レベルになります。このスーパーユーザーは、seniorid が -1 の唯一のユーザーです。スーパーユーザーはすべてのユーザーの親です。上記の表では、すべてのユーザーに子ユーザーが存在する場合と存在しない場合があります。親ユーザーと子ユーザーの関係は表に記載されており、seniorid の数字は他のユーザーの ID にすぎません。

例えば:

次のユーザーを検討してください

id  | username  | seniorid
18  | user17    |    8

上記の場合、seniorid は 8 なので、上記のユーザーの親は

8   | user7 |    6

「user7」6のsenioridとして、親が

6   | user5 |    1

このようにバックトラックを行うと、「スーパーユーザー」から「user17」までの階層の次のリストが取得されます

id  | username  | seniorid
1   | Superuser |   -1
6   | user5 |    1
8   | user7 |    6
18  | user17    |    8

この階層には最大 n レベル、つまり最大多数のレベルがあります

単一のクエリを使用して、上記の階層結果が必要です。

上記のクエリを作成するには、あなたの助けが必要です。誰でもmysqlでそのようなクエリを教えてください。

1 回のクエリで調べる必要があるシニア ユーザー リストを持つユーザーの ID、ユーザー名、シニア ID があります。ここで、単一のクエリとは、複数のネストされたクエリが含まれている可能性があることを意味します。しかし、全体としては、単一のクエリとして起動されます。

4

2 に答える 2

0

mysql を使用している場合は、ネストされたセットを使用してこの問題を解決することをお勧めします。これを読んでみてください http://www.fliquidstudios.com/2008/12/23/nested-set-in-mysql/

于 2012-10-03T12:21:35.297 に答える
0

私の知る限り、取得するレベルの数がわからない場合、単一のクエリでこれを行うことはできません。

nレベルが必要な場合、クエリは次のようになります。

SELECT * FROM users u 
LEFT JOIN users u1 on u1.id = u.seniorid
LEFT JOIN users u2 on u2.id = u1.seniorid
...
LEFT JOIN users u{n-1} on u{n-1}.id = u{n-2}.seniorid
WHERE u.id = 1

階層レベルの最大数を定義して、そのようなクエリを生成できます。

それができない場合は、レベルと同じ数のクエリをチェーンする必要があります...

編集:このように:

<?php
    function addSeniors($id,&$array){
        $s = "SELECT * FROM users WHERE id = $id";
        $q = mysql_query($q);
        $results = array();
        while($r = mysql_fetch_assoc($q)){
            $array[]=$r;
            addSeniors($r('seniorid'),$array);
        }
    }

    $s = "SELECT * FROM users WHERE id = 1";
    $q = mysql_query($s);
    $results = array(mysql_fetch_assoc($q));

    addSeniors($r['seniorid'],$results);
?>
于 2012-10-03T12:03:29.350 に答える