質問: テーブル情報 - id 自動採番値 - parent_id 親idを指定 - root_id ツリーのルートのidを指定/ルートレコードである場合はNULL - lft - rgt 上記テーブルをselectする際に、子要素がルートから何階層(int)離れているかをSQLで求めたいのですが、方法が分かりません。 ご教授をお願い致します。 また、 ``` order by root_id, lft ``` でツリー構造順に並び替えることが出来るようです。 イメージ: ルート 子要素 子子要素 子子要素 子要素
回答: MySQL 8.0 からは CTE が使えます ``` WITH RECURSIVE r AS ( SELECT id, 0 AS depth FROM some_table UNION ALL SELECT T2.id, T1.depth + 1 FROM r T1 CROSS JOIN some_table T2 WHERE T1.id = T2.parent_id ) SELECT id, max(depth) FROM r GROUP BY id ORDER BY id; ``` のようにすることで、親エントリの数を数えることができます CTE を使えないのであれば、SQLで全件取得し、他プログラムで親を数える以外に方法がないと思います