我的国家/地区区域划分table
,其行为如下:
(名称在Google上翻译)
此级别对应于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 :(得分: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>
答案 1 :(得分: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';