いくつかの可能なアプローチ。あなたがやりたいことから、私があなたに提案することへと進みます。
マテリアライズド パス
残念ながら、列挙されたパスの祖先 (親子関係など)はコストが高く、SQL のみで行うには扱いにくい(マテリアライズド パスの検索に関するセクションを参照"An employee FORD and chain of his supervisors"
)。事前にパスがあり、ある種のプログラミング言語を使用できる場合、最も簡単な方法はIN
句を使用することです。
SELECT *
FROM woe
WHERE ancestry IN (
'1',
'1/23424975',
'1/23424975/24554868',
'1/23424975/24554868/12602167',
'1/23424975/24554868/12602167/12696151'
)
ORDER BY LEN(ancestry)
隣接リスト
または、データの隣接リストの側面を利用して、共通テーブル式を使用するか、CONNECT BY
代わりにデータベースに依存することができます (これはancestry
列を無視します)。隣接リストを使用して祖先を照会する方法については、RDBMS で階層データを表現するさまざまな方法に関する私の質問を参照してください (質問の最後にあるデータベース固有の注意事項のセクションを参照してください)。
ネストされたセット
データは変更されず、祖先を照会したいと書いています。ネストされたセット表現は、SQL のみを使用して必要な情報を取得するのが簡単で、どのデータベースでも機能し、非常に安価な操作であるため、この状況では完璧なアプローチです。欠点は、移動と挿入に費用がかかることです。MySQL での階層データの管理は、それがどのように機能するかについて私が提供できる最良の説明です。
入れ子になったセットは、あなたのデータ、あなたがしたいこと、そしてそれが変わらないことを考えると、私が使用するものです。