0

我有一个table针对我的国家的领土划分,如下所示:

  • 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')

到目前为止,一切都很好。现在我的问题是:如何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 回答