2012-07-22 63 views
0

我必須爲我的國家領土劃分一個table,這確實如下:MySQL的 - 等級選擇

  • 級別0:國家
  • 1級:區
  • 2級:縣
  • 水平3:教區

(名字被翻譯在谷歌)

該水平對應於去如下一個parent => child僞關係:

TABLE zones 

id 
parent_id 
name 

的樣本數據:

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

到目前爲止好。現在我的問題是:如何從某個區域(1級)選擇與其相關的所有zones

+0

這是什麼意思「相關」?那在同一個國家?還是所有的「孩子」縣?或教區?或所有這些? :] – 2012-07-22 20:37:14

+0

也許這是令人困惑的。 'parent_id'是父區''的'id',所以'LEVEL 1'是'LEVEL 2'的父親,它是'LEVEL 3'的父親' – yoda 2012-07-22 20:42:48

+0

在某些時候,需要討論是否這個層次結構一般起作用(在美國,'國家'有縣;在英國,'國家'和'縣'之間沒有'區'級)。但是,這與主要問題是相切的。 – 2012-07-22 20:43:05

回答

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> 
+0

Exacly我需要什麼,謝謝! – yoda 2012-07-22 20:49:14

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';