0

私はtable私の国の領土区分のために持っています、それは次のようになります:

  • レベル0:国
  • レベル1:地区
  • レベル2:郡
  • レベル3:教区

(名前はGoogleで翻訳されました)

このレベルparent => childは、次のような疑似関係に対応しています。

TABLE zones

id
parent_id
name

サンプルデータ:

VALUES (1,0,'LEVEL 1')
VALUES (2,1,'LEVEL 2')
VALUES (3,2,'LEVEL 3')

ここまでは順調ですね。zones今私の問題は、それに関連する特定の地区(レベル1)からすべてを選択するにはどうすればよいですか?

4

2 に答える 2

1

これにより、すべての情報が結合された形式で取得されます。

SELECT *
FROM zones l1
INNER JOIN zones l2 ON l2.parent_id = l1.id
INNER JOIN zones l3 ON l3.parent_id = l2.id
WHERE l1.id = <id>

UNIONただし、関連するすべてのゾーン(地区自体は含まず、その地区の郡と小教区のみ)を単純に一覧表示する場合は、 :を使用する必要があります。

SELECT l2.*
FROM zones l1
INNER JOIN zones l2 ON l2.parent_id = l1.id
WHERE l1.id = <id>

UNION ALL

SELECT l3.*
FROM zones l1
INNER JOIN zones l2 ON l2.parent_id = l1.id
INNER JOIN zones l3 ON l3.parent_id = l2.id
WHERE l1.id = <id>
于 2012-07-22T20:45:39.723 に答える
1

階層の深さが固定されている場合(わずか4レベル)、SQLをかなり簡単に記述できます。階層が修正されていない場合は、もっと一生懸命働かなければなりません。

SELECT *
  FROM Zones
 WHERE name = 'LEVEL 1'
UNION
SELECT zc.*
  FROM Zones AS zd
  JOIN Zones AS zc ON zc.parent_id = zd.id
 WHERE zd.name = 'LEVEL 1'
UNION
SELECT zp.*
  FROM Zones AS zd
  JOIN Zones AS zc ON zc.parent_id = zd.id
  JOIN Zones AS zp ON zp.parent_id = zc.id
 WHERE zd.name = 'LEVEL 1';
于 2012-07-22T20:49:21.440 に答える