侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

MySQL多层级结构-区域表使用树详解

数据库  /  管理员 发布于 6年前   475

1.1. 前言

前面我们大概介绍了一下树结构表的基本使用。在我们项目中有好几块有用到多层级的概念。下面我们哪大家都比较熟悉的区域表来做演示。
1.2. 表结构和数据

区域表基本结构,可能在你的项目中还有包含其他字段。这边我只展示我们关心的字段:

CREATE TABLE `area` ( `area_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '地区ID', `name` varchar(40) NOT NULL DEFAULT 'unkonw' COMMENT '地区名称', `area_code` varchar(10) NOT NULL DEFAULT 'unkonw' COMMENT '地区编码', `pid` int(11) DEFAULT NULL COMMENT '父id', `left_num` mediumint(8) unsigned NOT NULL COMMENT '节点左值', `right_num` mediumint(8) unsigned NOT NULL COMMENT '节点右值', PRIMARY KEY (`area_id`), KEY `idx$area$pid` (`pid`), KEY `idx$area$left_num` (`left_num`), KEY `idx$area$right_num` (`right_num`))

区域表数据: area
导入到test表

mysql -uroot -proot test < area.sql

1.1. 区域表的基本操作

查看 '广州' 的相关信息

SELECT * FROM area WHERE name LIKE '%广州%';+---------+-----------+-----------+------+----------+-----------+| area_id | name   | area_code | pid | left_num | right_num |+---------+-----------+-----------+------+----------+-----------+|  2148 | 广州市  | 440100  | 2147 |   2879 |   2904 |+---------+-----------+-----------+------+----------+-----------+

查看 '广州' 所有孩子

SELECT c.* FROM area AS p, area AS cWHERE c.left_num BETWEEN p.left_num AND p.right_num AND p.area_id = 2148;+---------+-----------+-----------+------+----------+-----------+| area_id | name   | area_code | pid | left_num | right_num |+---------+-----------+-----------+------+----------+-----------+|  2148 | 广州市  | 440100  | 2147 |   2879 |   2904 ||  2161 | 从化市  | 440184  | 2148 |   2880 |   2881 ||  2160 | 增城市  | 440183  | 2148 |   2882 |   2883 ||  2159 | 花都区  | 440114  | 2148 |   2884 |   2885 ||  2158 | 番禺区  | 440113  | 2148 |   2886 |   2887 ||  2157 | 黄埔区  | 440112  | 2148 |   2888 |   2889 ||  2156 | 白云区  | 440111  | 2148 |   2890 |   2891 ||  2154 | 天河区  | 440106  | 2148 |   2892 |   2893 ||  2153 | 海珠区  | 440105  | 2148 |   2894 |   2895 ||  2152 | 越秀区  | 440104  | 2148 |   2896 |   2897 ||  2151 | 荔湾区  | 440103  | 2148 |   2898 |   2899 ||  2150 | 东山区  | 230406  | 2148 |   2900 |   2901 ||  2149 | 其它区  | 440189  | 2148 |   2902 |   2903 |+---------+-----------+-----------+------+----------+-----------+

查看 '广州' 所有孩子 和 深度 并显示层级关系

SELECT sub_child.area_id, (COUNT(sub_parent.name) - 1) AS depth, CONCAT(REPEAT(' ', (COUNT(sub_parent.name) - 1)), sub_child.name) AS nameFROM ( SELECT child.*  FROM area AS parent, area AS child WHERE child.left_num BETWEEN parent.left_num AND parent.right_num  AND parent.area_id = 2148) AS sub_child, (   SELECT child.*  FROM area AS parent, area AS child WHERE child.left_num BETWEEN parent.left_num AND parent.right_num  AND parent.area_id = 2148) AS sub_parentWHERE sub_child.left_num BETWEEN sub_parent.left_num AND sub_parent.right_numGROUP BY sub_child.area_idORDER BY sub_child.left_num;+---------+-------------+-------+| area_id | name    | depth |+---------+-------------+-------+|  2148 | 广州市   |   0 ||  2161 |  从化市  |   1 ||  2160 |  增城市  |   1 ||  2159 |  花都区  |   1 ||  2158 |  番禺区  |   1 ||  2157 |  黄埔区  |   1 ||  2156 |  白云区  |   1 ||  2154 |  天河区  |   1 ||  2153 |  海珠区  |   1 ||  2152 |  越秀区  |   1 ||  2151 |  荔湾区  |   1 ||  2150 |  东山区  |   1 ||  2149 |  其它区  |   1 |+---------+-------------+-------+

显示 '广州' 的直系祖先(包括自己)

SELECT p.* FROM area AS p, area AS cWHERE c.left_num BETWEEN p.left_num AND p.right_num AND c.area_id = 2148;+---------+-----------+-----------+------+----------+-----------+| area_id | name   | area_code | pid | left_num | right_num |+---------+-----------+-----------+------+----------+-----------+|  2147 | 广东省  | 440000  |  0 |   2580 |   2905 ||  2148 | 广州市  | 440100  | 2147 |   2879 |   2904 ||  3611 | 中国   | 100000  |  -1 |    1 |   7218 |+---------+-----------+-----------+------+----------+-----------+

向 '广州' 插入一个地区 '南沙区'

-- 更新左右值UPDATE area SET left_num = left_num + 2 WHERE left_num > 2879;UPDATE area SET right_num = right_num + 2 WHERE right_num > 2879; -- 插入 '南沙区' 信息INSERT INTO areaSELECT NULL, '南沙区', '440115', 2148, left_num + 1, left_num + 2FROM area WHERE area_id = 2148; -- 查看是否满足要求SELECT c.* FROM area AS p, area AS cWHERE c.left_num BETWEEN p.left_num AND p.right_num AND p.area_id = 2148;+---------+-----------+-----------+------+----------+-----------+| area_id | name   | area_code | pid | left_num | right_num |+---------+-----------+-----------+------+----------+-----------+|  2148 | 广州市  | 440100  | 2147 |   2879 |   2906 ||  3612 | 南沙区  | 440115  | 2148 |   2880 |   2881 ||  2161 | 从化市  | 440184  | 2148 |   2882 |   2883 ||  2160 | 增城市  | 440183  | 2148 |   2884 |   2885 ||  2159 | 花都区  | 440114  | 2148 |   2886 |   2887 ||  2158 | 番禺区  | 440113  | 2148 |   2888 |   2889 ||  2157 | 黄埔区  | 440112  | 2148 |   2890 |   2891 ||  2156 | 白云区  | 440111  | 2148 |   2892 |   2893 ||  2154 | 天河区  | 440106  | 2148 |   2894 |   2895 ||  2153 | 海珠区  | 440105  | 2148 |   2896 |   2897 ||  2152 | 越秀区  | 440104  | 2148 |   2898 |   2899 ||  2151 | 荔湾区  | 440103  | 2148 |   2900 |   2901 ||  2150 | 东山区  | 230406  | 2148 |   2902 |   2903 ||  2149 | 其它区  | 440189  | 2148 |   2904 |   2905 |+---------+-----------+-----------+------+----------+-----------+


  • 上一条:
    Mysql中新建用户及授权的方法分享
    下一条:
    MySQL多层级结构-树搜索介绍
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客