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 c

WHERE 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 name

FROM (

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_parent

WHERE sub_child.left_num BETWEEN sub_parent.left_num AND sub_parent.right_num

GROUP BY sub_child.area_id

ORDER 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 c

WHERE 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 area

SELECT NULL, '南沙区', '440115', 2148, left_num + 1, left_num + 2

FROM area WHERE area_id = 2148;

-- 查看是否满足要求

SELECT c.*

FROM area AS p, area AS c

WHERE 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多层级结构-区域表使用树详解相关推荐

  1. mysql行转列和列转行_mysql 行转列和列转行实例详解

    mysql行转列.列转行 语句不难,不做多余解释了,看语句时,从内往外一句一句剖析 行转列 有如图所示的表,现在希望查询的结果将行转成列 建表语句如下: create table `test_tb_g ...

  2. mysql中的文件导入导出表设计_mysql导入导出表结构及表数据及执行sql文件

    从数据库导出数据库文件: 1.将数据库mydb导出到e:\MySQL\mydb.sql文件中: 打开开始->运行->输入cmd 进入命令行模式 c:\>MySQLdump -h lo ...

  3. mysql 创建删除表_mysql创建删除表的实例详解

    表的创建命令需要: 表的名称 字段名称 定义每个字段(类型.长度等) 语法 下面是通用的SQL语法用来创建MySQL表: CREATE TABLE table_name (column_name ...

  4. MySQL隔离级别--未提交读,提交读,可重复读,序列化--详解(有示例)

    原文网址:MySQL隔离级别--未提交读,提交读,可重复读,序列化--详解(有示例)_IT利刃出鞘的博客-CSDN博客 简介          本文介绍MySQL的事务隔离级别的含义,并用示例说明各个 ...

  5. mysql将权限赋给某个用户_mysql 赋给用户权限

    遇到了 SQLException: access denied for  @'localhost' (using password: no) 解决办法   grant all privileges o ...

  6. mysql数据库帐户_MySQL数据库用户帐号管理基础知识详解

    MySQL管理员应该知道怎样通过指定哪些用户可连接到服务器.从哪里进行连接,以及在连接 时做什么,来设置MySQL用户账号.MySQL3.22.11引入了两个更容易进行这项工作的语句:GRANT 语句 ...

  7. mysql n叉树_MySQL索引底层:B+树详解

    前言 当我们发现SQL执行很慢的时候,自然而然想到的就是加索引.对于范围查询,索引的底层结构就是B+树.今天我们一起来学习一下B+树哈~ 公众号:捡田螺的小男孩 树简介.树种类 B-树.B+树简介 B ...

  8. mysql启动失败 查看日志文件_mysql诊断启动问题、查看日志文件详解

    诊断启动问题 服务器启动问题通常在对MySQL配置或服务器本身进行更改时出现.MySQL在这个问题发生时报告错误,但由于多数MySQL服务器是作为系统进程或服务自动启动的,这些消息可能看不到. 在排除 ...

  9. mysql installer安装_MySQL Installer 8.0.21安装教程图文详解

    1. 缘由 刚好需要在新系统上重新安装MySQL,便写了一份的下载安装教程,供查阅,以防日后细节有所遗忘. 2. 版本说明 MySQL Installer 8.0.21 3. 下载安装包 方式一:官网 ...

最新文章

  1. 夏天到了用TypeScript给自己开个小空调吧
  2. 8)排序①排序算法之交换排序[1]冒泡排序法
  3. 《iOS 9 开发指南》——第6章,第6.4节 Interface Builder中的故事板——Storyboarding...
  4. Linux字符界面操作进阶
  5. 线性递推式+求第N项,用矩阵快速幂 如何构造初始矩阵
  6. runc容器逃逸漏洞最强后续:应对之策汇总与热点疑问解答
  7. 《终身成长》读书笔记(part8)--努力的过程并不只包含努力本身
  8. macOS下的视频格式转换器
  9. xampp浏览php出现乱码,dvwa+xampp搭建显示乱码的问题及解决方案
  10. 有福利! 好书推荐:从《实用推荐系统》学习寻找用户行为之法
  11. 在yuv域如何降低画面亮度_家庭影院投影机错误地调节了亮度和对比度会得到怎么样的画面?...
  12. wps里为什么没有华文楷体_【上寮金贝幼儿园父母课堂】“为什么老师发的照片里没有我家孩子?”...
  13. 【CSS基础笔记】——盒模型、块级元素、行内元素、浮动、对齐、定位
  14. 数据挖掘之Apriori算法详解和Python实现代码分享_python
  15. pool.map()爬取美文网标题内容
  16. 各自然带代表植被_各气候带对应植被
  17. ios 画带有箭头的线_iOS 箭头类型视图的几点心得
  18. 计算机桌面死机的原因是,假死机(电脑桌面假死或卡死)
  19. autojs和按键精灵哪个好?按键精灵打包开始收费了,是弃坑还是继续杠?
  20. 卷积神经网络学习路线(十一)| Stochastic Depth(随机深度网络)

热门文章

  1. Java项目经验——程序员成长的关键
  2. 数字化转型升级,人才战略是核心
  3. 【gitlab】gitlab快速部署教程
  4. new操作符到底干了什么?
  5. XMLHttpRequest 对象
  6. 记一次T-SQL查询优化 索引的重要性
  7. 层模型--绝对定位、相对定位、固定定位
  8. ECshop网点程序优化-后台添加类目自动选择上次父类目并计算Sort Order
  9. RHEL6入门系列之二十七,源码安装及软件安装综合实例
  10. /scriptalert(/xss/)/script