MySQL — 分层选择

  • 本文关键字:选择 分层 MySQL mysql
  • 更新时间 :
  • 英文 :


我对我的国家领土划分有一个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';

最新更新