2017-02-13 7 views
-1

を見つけた場合、私はそうのようなテーブル構造持つ親を返す:私はケントを検索した場合ので、私は、名前で表を照会していますクエリ子供と

locationID  locationName parentID 
    1   Europe   0 
    2   England   1 
    3    Kent   2 

を。私はそれが検索結果としてヨーロッパ>イングランド>ケントを返すようにします。

誰でも正しいクエリの方向性を指摘できますか。それは同じテーブルの左結合ですか?

+0

確認したいレベルはいくつですか? 3つだけ? – GurV

+0

多かれ少なかれ6または7になる可能性があります –

+0

ストアドプロシージャが必要です – GurV

答えて

0

MySQLが再帰クエリのネイティブサポートを提供していません。

階層内のレベルの最大数を設定すると、クエリを記述することができます。例として

SELECT g0.locationName 
     , g1.locationName 
     , g2.locationName 
     , g3.locationName 
     , g4.locationName 
     , g5.locationName 
     , g6.locationName 
    FROM mytable g0 
    LEFT JOIN mytable g1 ON g1.locationId = g0.parentId 
    LEFT JOIN mytable g2 ON g2.locationId = g1.parentId 
    LEFT JOIN mytable g3 ON g3.locationId = g2.parentId 
    LEFT JOIN mytable g4 ON g4.locationId = g3.parentId 
    LEFT JOIN mytable g5 ON g5.locationId = g4.parentId 
    LEFT JOIN mytable g6 ON g6.locationId = g5.parentId 
    WHERE g0.locationName = 'Kent' 

このアプローチは、レベル、G7、G8、G9の多数に拡張することができます。しかし、クエリでは、通過するレベルの最大数が課されます。

クエリでは「ループ」のチェックは行われません。たとえば、 "Europe"に "Kent"を参照するparentIdがある場合、階層内のループになります。クエリは、その条件をチェックするための何もしません、それはちょうど親へのリンクをたどり、その周りとその周り行くでしょう。

ダイナミックな数のレベルを許可して、MySQLで動作させるには、いくつかの条件付きロジックを持つMySQLストアドプログラム(PROCEDURE)が必要です。より再帰的なアプローチを実装することができます。

0

階層のみ[はい、あなたが必要なデータを取得するためにself joinを使用することができます3つのレベルまで下がることができれば、例えば:

SELECT l3.locationName, l2.locationName, l1.locationName 
FROM location l1 JOIN location l2 ON l1.locationID = l2.parentId 
JOIN location l3 ON l2.locationID = l3.parentID 
WHERE l3.locationName = 'Kent'; 
+0

レベルがさらにある場合はどうなりますか? –

+0

さらにレベルがある場合は、さらにジョインを追加できます。 –