を見つけた場合、私はそうのようなテーブル構造持つ親を返す:私はケントを検索した場合ので、私は、名前で表を照会していますクエリ子供と
locationID locationName parentID
1 Europe 0
2 England 1
3 Kent 2
を。私はそれが検索結果としてヨーロッパ>イングランド>ケントを返すようにします。
誰でも正しいクエリの方向性を指摘できますか。それは同じテーブルの左結合ですか?
を見つけた場合、私はそうのようなテーブル構造持つ親を返す:私はケントを検索した場合ので、私は、名前で表を照会していますクエリ子供と
locationID locationName parentID
1 Europe 0
2 England 1
3 Kent 2
を。私はそれが検索結果としてヨーロッパ>イングランド>ケントを返すようにします。
誰でも正しいクエリの方向性を指摘できますか。それは同じテーブルの左結合ですか?
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)が必要です。より再帰的なアプローチを実装することができます。
階層のみ[はい、あなたが必要なデータを取得するために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';
レベルがさらにある場合はどうなりますか? –
さらにレベルがある場合は、さらにジョインを追加できます。 –
確認したいレベルはいくつですか? 3つだけ? – GurV
多かれ少なかれ6または7になる可能性があります –
ストアドプロシージャが必要です – GurV