用于查找内部,叶子和根节点的SQL查询

时间:2017-08-08 00:08:23

标签: mysql

我有一张如下表:

ID   P_ID
1      2
3      2
6      8
9      8
2      5
8      5
5     null

我使用了查询

SELECT ID,  
   CASE 
        WHEN P_ID IS NULL THEN 'Root'
        WHEN NOT EXISTS (SELECT ID FROM MINOA.TREE WHERE P_ID=T0.ID) THEN 'Leaf'
        ELSE 'Inner'
    END T
FROM MINOA.TREE T0
ORDER BY ID;

我得到的输出是:

ID     P_ID
1      leaf
2      inner
3      leaf
5      inner
6      leaf
8      inner
9      leaf

但对于ID 5,它应该返回Root

1 个答案:

答案 0 :(得分:0)

我已经创建了这样的表:

+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
| p_id  | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+

使用您的值:

+------+------+
| id   | p_id |
+------+------+
|    1 |    2 |
|    3 |    2 |
|    6 |    8 |
|    9 |    8 |
|    2 |    5 |
|    8 |    5 |
|    5 | NULL |
+------+------+

执行此查询:

SELECT id, CASE WHEN p_id IS NULL THEN 'Root' WHEN NOT EXISTS (SELECT id FROM tree WHERE p_id = t0.id) THEN 'Leaf' ELSE 'Inner' END as PROPERTY from tree t0 order by id;

返回:

+------+----------+
| id   | PROPERTY |
+------+----------+
|    1 | Leaf     |
|    2 | Inner    |
|    3 | Leaf     |
|    5 | Root     |
|    6 | Leaf     |
|    8 | Inner    |
|    9 | Leaf     |
+------+----------+