これがあなたの望むものかどうかわかりません、私に知らせてください:
重要なフィールド(id、module、module son)を使用してテーブルを作成し、いくつかのダムデータを入力しました。これが私が持っているものです。
mysql> show create table groups\G
*************************** 1. row ***************************
Table: groups
Create Table: CREATE TABLE `groups` (
`id` int(11) DEFAULT NULL,
`modu` varchar(200) DEFAULT NULL,
`sub_group` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> insert into groups (id,modu,sub_group) values (16,'Module 1',null),
-> (19,'Submodule 1' ,16),
-> (20,'Submodule 2' , 16),
-> (22,'Submodule 3' , 16),
-> (24,'Module 2',null),
-> (25,'Module 3',null),
-> (26,'Submodule 4', 25),
-> (27,'Submodule 5', 25),
-> (28,'Submodule 6', 25);
Query OK, 9 rows affected (0.00 sec)
Records: 9 Duplicates: 0 Warnings: 0
mysql> select * from groups;
+------+-------------+-----------+
| id | modu | sub_group |
+------+-------------+-----------+
| 16 | Module 1 | NULL |
| 19 | Submodule 1 | 16 |
| 20 | Submodule 2 | 16 |
| 22 | Submodule 3 | 16 |
| 24 | Module 2 | NULL |
| 25 | Module 3 | NULL |
| 26 | Submodule 4 | 25 |
| 27 | Submodule 5 | 25 |
| 28 | Submodule 6 | 25 |
+------+-------------+-----------+
9 rows in set (0.00 sec)
そして重要なことは、私が「自己結合」を適用したクエリであり、次のようになります。
mysql> select * from groups as t1 join groups as t2 on t1.id=t2.sub_group;
+------+----------+-----------+------+-------------+-----------+
| id | modu | sub_group | id | modu | sub_group |
+------+----------+-----------+------+-------------+-----------+
| 16 | Module 1 | NULL | 19 | Submodule 1 | 16 |
| 16 | Module 1 | NULL | 20 | Submodule 2 | 16 |
| 16 | Module 1 | NULL | 22 | Submodule 3 | 16 |
| 25 | Module 3 | NULL | 26 | Submodule 4 | 25 |
| 25 | Module 3 | NULL | 27 | Submodule 5 | 25 |
| 25 | Module 3 | NULL | 28 | Submodule 6 | 25 |
+------+----------+-----------+------+-------------+-----------+
6 rows in set (0.00 sec)
結果を単純化したい場合:
mysql> select t1.id as ID, t1.modu as PARENT, t2.modu as SON from groups as t1 join groups as t2 on t1.id=t2.sub_group;
+------+----------+-------------+
| ID | PARENT | SON |
+------+----------+-------------+
| 16 | Module 1 | Submodule 1 |
| 16 | Module 1 | Submodule 2 |
| 16 | Module 1 | Submodule 3 |
| 25 | Module 3 | Submodule 4 |
| 25 | Module 3 | Submodule 5 |
| 25 | Module 3 | Submodule 6 |
+------+----------+-------------+
6 rows in set (0.00 sec)
子を持つモジュールのみが表示されます。
それらすべてを表示したい場合は、これを行うことができます
mysql> select t1.id as ID, t1.modu as PARENT, t2.modu as SON from groups as t1 join groups as t2 on t1.id=IFNULL(t2.sub_group,t2.id);
+------+----------+-------------+
| ID | PARENT | SON |
+------+----------+-------------+
| 16 | Module 1 | Module 1 |
| 16 | Module 1 | Submodule 1 |
| 16 | Module 1 | Submodule 2 |
| 16 | Module 1 | Submodule 3 |
| 24 | Module 2 | Module 2 |
| 25 | Module 3 | Module 3 |
| 25 | Module 3 | Submodule 4 |
| 25 | Module 3 | Submodule 5 |
| 25 | Module 3 | Submodule 6 |
+------+----------+-------------+
9 rows in set (0.00 sec)
またはこのように
mysql> select t1.id as ID, t1.modu as PARENT, if(t2.modu=t1.id,NULL,t2.sub_group) as SON from groups as t1 join groups as t2 on t1.id=IFNULL(t2.sub_group,t2.id);
+------+----------+------+
| ID | PARENT | SON |
+------+----------+------+
| 16 | Module 1 | NULL |
| 16 | Module 1 | 16 |
| 16 | Module 1 | 16 |
| 16 | Module 1 | 16 |
| 24 | Module 2 | NULL |
| 25 | Module 3 | NULL |
| 25 | Module 3 | 25 |
| 25 | Module 3 | 25 |
| 25 | Module 3 | 25 |
+------+----------+------+
9 rows in set, 9 warnings (0.00 sec)