私はこのようなMySQLテーブルを持っています:
mysql> SELECT ID, Username, Parent, LeftNum, RightNum FROM usercopy;
+----+------------+----------+---------+----------+
| ID | Username | Parent | LeftNum | RightNum |
+----+------------+----------+---------+----------+
| 1 | root | | 1 | 92 |
| 2 | robson | perta | 62 | 89 |
| 3 | budi | root | 2 | 35 |
| 4 | bejo | root | 36 | 47 |
| 5 | ben | puff | 13 | 24 |
| 6 | boll | root | 48 | 91 |
| 7 | charlie | robson | 63 | 80 |
| 8 | charles | robson | 81 | 88 |
| 9 | doni | budi | 3 | 28 |
| 10 | dono | budi | 29 | 34 |
| 11 | donatello | bejo | 37 | 38 |
| 12 | donat | bejo | 39 | 42 |
| 13 | tello | bejo | 43 | 46 |
| 14 | pras | ben | 14 | 15 |
| 15 | prasetyo | ben | 16 | 21 |
| 16 | pram | ben | 22 | 23 |
| 17 | jeni | boll | 49 | 58 |
| 18 | cocala | boll | 59 | 60 |
| 19 | perta | boll | 61 | 90 |
| 20 | joko | charlie | 64 | 65 |
| 21 | aditya | charlie | 66 | 79 |
| 22 | mogot | aditya | 67 | 70 |
| 23 | arya | aditya | 71 | 78 |
| 24 | saiful | mogot | 68 | 69 |
| 25 | nur | arya | 72 | 77 |
| 26 | herlambang | nur | 73 | 74 |
| 27 | barney | nur | 75 | 76 |
| 28 | conan | charles | 82 | 85 |
| 29 | john | charles | 86 | 87 |
| 30 | mark | conan | 83 | 84 |
| 31 | mike | doni | 4 | 11 |
| 32 | puff | doni | 12 | 25 |
| 33 | karti | doni | 26 | 27 |
| 34 | sukarto | mike | 5 | 6 |
| 35 | harto | mike | 7 | 8 |
| 36 | tien | mike | 9 | 10 |
| 37 | tono | dono | 30 | 31 |
| 38 | thomas | dono | 32 | 33 |
| 39 | dunkin | donat | 40 | 41 |
| 40 | jentol | tello | 44 | 45 |
| 41 | henri | prasetyo | 17 | 18 |
| 42 | yani | prasetyo | 19 | 20 |
| 43 | juli | jeni | 50 | 51 |
| 44 | rio | jeni | 52 | 53 |
| 45 | luke | jeni | 54 | 55 |
| 46 | harry | jeni | 56 | 57 |
+----+------------+----------+---------+----------+
セットで46行(0.00秒)
私が今していることは、PHP LOOPを使用して、彼/彼女の親に基づいたグループメンバーを表示することです。しかし、出力が単一のSQLコマンドで作成されるように、このMySQLテーブルを結合/グループ化する方法がわかりません。
これが私がPHPで行うことです。たとえば、私のユーザー名は「robson」です。
1. `SHOW any users with parent name = robson`
mysql> SELECT ID, Username, Parent, LeftNum, RightNum FROM usercopy WHERE Parent = 'robson';
+----+----------+--------+---------+----------+
| ID | Username | Parent | LeftNum | RightNum |
+----+----------+--------+---------+----------+
| 7 | charlie | robson | 63 | 80 |
| 8 | charles | robson | 81 | 88 |
+----+----------+--------+---------+----------+
セットの2行(0.00秒)
2. `SHOW Charlie's descendent`
mysql> select ID, Username, Parent, LeftNum, RightNum from usercopy where LeftNum BETWEEN 63 AND 80;
+----+------------+---------+---------+----------+
| ID | Username | Parent | LeftNum | RightNum |
+----+------------+---------+---------+----------+
| 7 | charlie | robson | 63 | 80 |
| 20 | joko | charlie | 64 | 65 |
| 21 | aditya | charlie | 66 | 79 |
| 22 | mogot | aditya | 67 | 70 |
| 23 | arya | aditya | 71 | 78 |
| 24 | saiful | mogot | 68 | 69 |
| 25 | nur | arya | 72 | 77 |
| 26 | herlambang | nur | 73 | 74 |
| 27 | barney | nur | 75 | 76 |
+----+------------+---------+---------+----------+
セットで9行(0.00秒)
3. LOOP Step 2 to SHOW Charles's descendent
mysql> select ID, Username, Parent, LeftNum, RightNum from usercopy where LeftNum BETWEEN 81 AND 88;
+----+----------+---------+---------+----------+
| ID | Username | Parent | LeftNum | RightNum |
+----+----------+---------+---------+----------+
| 8 | charles | robson | 81 | 88 |
| 28 | conan | charles | 82 | 85 |
| 29 | john | charles | 86 | 87 |
| 30 | mark | conan | 83 | 84 |
+----+----------+---------+---------+----------+
セットの4行(0.00秒)
ここで問題となるのは、単一のSQLコマンドでSTEP 2、STEP 3、…、STEP X(ステップ1の子孫の数に基づく)を実行する方法です。