2016-09-17 50 views
0

我有一張如下所示的表格,它是樹的表示。MySQL病例聲明問題

id --- parentid 
1  NULL 
2  1 
3  1 
4  2 

這裏1是根節點,4,3是葉節點,2是中間節點。如何寫它打印

id ---- type 
1  root 
2  intermiditae 
3  leaf 
4  leaf 
+0

我會爲根添加'ID = 1的parentId = 1'到數據。查詢應該與3個選擇的聯合,根,interm和leaf:'select id,'root'作爲id = parentid union select ...的數據類型。處理這個問題並返回查詢。 – PeterMmm

+0

是的,對不起,我會編輯 – Vinny

回答

1

這裏是做的一種方式的SQL查詢:

SELECT mytable.id, IF(mytable.parent_id IS NULL, 'root', 
         IF(COUNT(children.id) > 0, 'intermediate', 'leaf')) 
FROM mytable 
LEFT JOIN mytable AS children ON children.parent_id = mytable.id 
GROUP BY mytable.id; 

「根」是其parent_idNULL行。然後,計算孩子的數量就足以確定入口是否是葉子。


您還可以獲取3個查詢和UNION相同的結果。

(SELECT mytable.id, 'root' AS type 
FROM mytable 
WHERE mytable.parent_id IS NULL) 
UNION 
(SELECT mytable.id, 'intermediate' AS type 
FROM mytable 
JOIN mytable AS children ON children.parent_id = mytable.id 
WHERE mytable.parent_id IS NOT NULL 
GROUP BY mytable.id) 
UNION 
(SELECT mytable.id, 'leaf' AS type 
FROM mytable 
LEFT JOIN mytable AS children ON children.parent_id = mytable.id 
WHERE children.id IS NULL); 
0

使用左連接本身來決定孩子的存在:

select id, 
    case when parent_id is null then 'root' 
    when child is null then 'leaf' 
    else 'intermediate' end as type 
from mytable 
left join (select parent_id parent, max(id) child 
    from mytable group by 1) x on parent = id