2011-01-14 11 views
3

パス列挙型の列からパン粉を作成したいと思います。パス列挙型mySQLパン粉を作成するためのクエリ

ここに私が持っているデータセットの例があります。 idwoeidparent_woeidcountry_code

https://spreadsheets.google.com/ccc?key=0AsGYQbeSAIgFdGRscFpsZFJpQUtfWGIwYWNUY2ktRHc&hl=en_GB&authkey=CPOuuogFnamelanguageplace_typeancestry

祖先パス列挙は、1/23424975/24554868/12602167/12696151ようなそのような英国のブライトンのパスです。

nameの列を照会してパンくずリストを取得し、すべての親を取得したいと考えています。

ie。世界、ヨーロッパ、イングランド、[郡]、[町]、[地域]、[場所]

([] = a placeholder)

データはこのテーブルには、隣接リストとパスの列挙を使用する理由である、変わることはありません。

答えて

5

いくつかの考えられる方法。私はあなたがしたいことから、私があなたがしていることに行くでしょう。

は残念ながら、is expensive and tricky to do with SQL only列挙パス祖先(例えば、親子関係は)("An employee FORD and chain of his supervisors"を見つけるマテリアライズドパスの項を参照してください)

パス

をマテリアライズド。あなたは、隣接リストを利用することができ、

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) 

隣接リスト

または:あなたが先に時間のパスを持っているプログラミング言語のいくつかの並べ替えを扱うことができた場合は、最も簡単な方法は、IN句を使用していますあなたのデータの様相と共通テーブル式を使用するか、データベースに応じてCONNECT BYを使用します(これはancestryの列を無視します)。祖先を照会する隣接リストの操作については、representing hierarchical data in an RDBMSのさまざまな方法についての私の質問を参照してください。質問末尾のデータベース固有の注釈セクションを参照してください。あなたのデータを書き込む

入れ子集合

あなたは祖先を照会するを変更していません。ネストされたセット表現は、SQLを使用して必要な情報を取得することは簡単で、どのデータベースでも動作し、非常に安価な操作であるため、この状況での完璧なアプローチです。欠点は動きがあり挿入が高価です。 Managing Hierarchical Data in MySQLは、おそらく私がそれがどのように機能するかについて私が提供できる最良の説明です。

入れ子集合は、私はあなたが、それは変更されないことをしたいのか、自分のデータを与えられたを使用したいものです。

関連する問題