MySQL - 分层选择

时间:2012-07-22 20:30:32

标签: mysql

我的国家/地区区域划分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')

到目前为止一切顺利。现在我的问题是:如何从某个区域(级别1)中选择与其相关的所有zones

2 个答案:

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