我对我的国家领土划分有一个table
,如下所示:
- 级别 0:国家/地区
- 1级:区
- 二级:县
- 第三级:堂区
(名字在谷歌上翻译(
此级别对应于如下所示的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
?
这将以连接格式获取所有信息:
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>
鉴于您对层次结构具有固定的深度(只有 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';