2016-09-17 7 views
0

私は木の表現である以下のような表があります。MySQLのケースステートメントの問題

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

ここで、1はルートノードであり、4,3はリーフノードであり、2は中間ノードである。

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されている行である:ここでは

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

私はへのルートのための 'のid = 1のParentID = 1 'を追加しますデータ。クエリは、3つのケース(ルート、interm、リーフ)に対して3つのselectの和集合で動作する必要があります: 'select id、 'id = parentid union select ...'のデータから' root 'これに取り組み、あなたの質問を取り戻してください。 – PeterMmm

+0

ええ、ごめんなさい、私は編集します – Vinny

答えて

1

を印刷し、それを行うための一つの方法であるSQLクエリを記述する方法。次に、子供の数を数えれば、その項目が葉であるかどうかを判断するのに十分です。


また、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