我们有这样一个需求:

做一个城市联动,比如说贵州省,省下面有众多市,市下面有众多区县,区县下面有众多镇,如果用多张表来存储,必然是能够简单的实现联动效果,但是多表的联合查询必然会影响到一些效率,此时可以考虑

用一张表来实现。

还有当我们要分的级数是不确定的,或者是很多的,那么建立多张表也是不合理的设计。

如何用一张表来存储呢?

该表的建立代码如下:

 1 create table city(id smallint unsigned auto_increment primary key,
 2 city_name varchar(20) not null ,parent_id smallint unsigned not null);
 3
 4 insert into city(city_name,parent_id) values("贵州",0);
 5 insert into city(city_name,parent_id) values("贵阳",1);
 6 insert into city(city_name,parent_id) values("遵义",1);
 7 insert into city(city_name,parent_id) values("铜仁",1);
 8 insert into city(city_name,parent_id) values("云南",0);
 9 insert into city(city_name,parent_id) values("昆明",4);
10 insert into city(city_name,parent_id) values("丽江",5);
11 insert into city(city_name,parent_id) values("四川",0);
12 insert into city(city_name,parent_id) values("成都",8);
13 insert into city(city_name,parent_id) values("浙江",0);
14 insert into city(city_name,parent_id) values("宁波",10);
15 insert into city(city_name,parent_id) values("河南",0);
16 insert into city(city_name,parent_id) values("郑州",12);
17 insert into city(city_name,parent_id) values("开封",12);
18 insert into city(city_name,parent_id) values("安阳",12);

我用了三个字段,其中parent_id存储的是父级的id,相当于是一个指针,指向父级。比如贵州,id为1,其中有贵阳,遵义,铜仁的parent_id为1,表示的含义为贵州省下有这三个城市。

为什么要有parent_id来指向父节点呢?我们来看看下面这张表。

就这张表而言,你能看出什么来?能看出成都是四川下的一个 市么?所以parent_id字段是必不可少的。

整张表是一个森林的数据结构,那么我们怎么查询到一个省下有多少个城市呢?

select p.id,p.city_name,s.city_name from city as p left join city as s onp.id=s.parent_id;

结果如下:

其中

select p.id,p.city_name,s.city_name表示查询出来的表只显示着三个字段,p代表父表,s代表子表。那么明明只有一张表,从何而来父表与子表呢?这就是所谓的自身连接。

你可以在脑海中想像另外一张表,该表和city表一模一样,然后像操作两张表一样将他们通过条件连接起来,此时我的条件就是p.id=s.parent_id;
left join表示左连接,意思就是父表的数据全部显示,子表的数据如果不存在则显示为空,比如上面显示的,郑州,我们通过p.id=s.parent_id没有查询到父表的id与子表的parent_id相同,于是父表的数据(13,郑州)

完全显示出来,子表的数据显示为空。

转载于:https://www.cnblogs.com/hzStudy/p/7287723.html

MYSQL无限级分类表设计及自我连接相关推荐

  1. 【MySQL】-无限级分类表设计与查询

    What? 举个简单的例子,我们设计购物商城之类的网站的时候一般商品都会有一级分类二级分类甚至三级分类或者再细分,如果按照传统思维我们可能会为每个级别的类别设置一张分类表然后再用外键去关联,虽然这样保 ...

  2. MySQL之无限级分类表设计

    首先查找一下goods_cates表和table_goods_brands数据表 分别使用命令: root@localhost test>show columns from goods_cate ...

  3. MySQL之库表设计篇:一到五范式、BC范式与反范式详解

    引言 MySQL的库表设计,在很多时候我们都是率性而为,往往在前期的设计中考虑并不全面,同时对于库表结构的划分也并不明确,所以很多时候在开发过程中,代码敲着敲着会去重构某张表结构,甚至大面积重构多张表 ...

  4. mysql 列换行 表设计 设计_今天来讲一下怎么利用MySql进行库表设计

    今天来讲一下怎么利用MySql进行库表设计 1 引擎选择 在 mysql 5.1 中,引入了新的插件式存储引擎体系结构,允许将存储引擎加载到正在运新的 mysql 服务器中.使用 mysql 插件式存 ...

  5. mysql 优惠卷表设计_这些年MySQL表设计踩过的坑!

    本文首发于个人微信公众号<andyqian>,期待你的关注! 前言 有朋友在后台留言.希望我能说说我在数据库表设计时踩过的坑.那么,我们今天就来聊聊我在数据库表设计时踩过的坑,以及现在对数 ...

  6. 【mysql】连表查询(内连接,左连接,右连接,全外连接)

    连表查询(内查询,左查询,右查询,全外查询) 说明 正文 创建表单 1:创建部门表:department 2:创建员工表:employee 内连接 左连接 右连接 全外连接 连表查询(内查询,左查询, ...

  7. mysql 评论回复表设计_【数据库】评论回复表设计

    一般系统发展到一定时候,就会需要加上评论功能.评论也会有很多形式,不同形式的评论展示表的设计也不一样.这里介绍几种比较常见的评论. 1.一问一答 张三:文章写的不错. 作者 回复 张三:谢谢你的认可 ...

  8. mysql 评论回复表设计_数据库设计——评论回复功能

    1.概述 评论功能已经成为APP和网站开发中的必备功能.本文主要介绍评论功能的数据库设计. 评论功能最主要的是发表评论和回复评论(删除功能在后台).评论功能的拓展功能体现有以下几方面: (1)单篇文章 ...

  9. 【MySQL】多表联合查询、连接查询、子查询

    文章目录 [1]连接查询 内连接查询 外连接查询 左连接 右连接 [2]联合查询 [3]子查询 带in关键字的子查询 带比较运算符的子查询 带exists的子查询 带any关键字的子查询 带all关键 ...

最新文章

  1. C语言:随笔8--结构体
  2. torch.load No module named
  3. 5G NR基础参数及帧结构
  4. DAO层接口性能监控
  5. Failed to issue method call Unit mysql service failed to lo
  6. (68)Verilog HDL系统函数和任务:$random
  7. 通过JDBC和Hibernate对Clob和Blob的操作
  8. sql语句如何拼接Java变量
  9. 游戏开发如此简单?我直接创建了一个游戏场景【python 游戏实战 02】
  10. APP内嵌h5页面如何分享到微信?
  11. 未能找到主机服务器是什么鬼,未能找到指定主机服务器是什么意思
  12. 对话甲乙丙丁CEO阮成瑜:要做产业互联网标杆,和新零售探路者
  13. 二十一世纪大学英语读写基础教程学习笔记(原文)——3 - Mothers(母亲)
  14. 3d可视化建模产品三维展示平台应用广
  15. Laravel的env和config傻傻分不清?
  16. 技术团队如何做技术规划?
  17. 社群运营,做好社群长期活跃可以从哪些方面入手?
  18. 信号与系统难点之(双边、单边)Z变换的时移性质
  19. 深度:一文看懂Linux内核,Linux内核架构和工作原理详解
  20. 软件工程2019:第2次作业—— 时事点评

热门文章

  1. Android自定义柱状图表效果
  2. 超300程序员受益入职的面试经验
  3. VMware Horizon View 7.5 如何部署虚拟桌面, 专业技术咨询和购买
  4. 26期20180606 chmod chown umask 隐藏权限
  5. linux动态库加载RPATH,RUNPATH
  6. 今天装了个GPS时钟
  7. 程序员的奋斗史(二)——今天你跑步了吗
  8. [Xilinx]Xilinx ISE14.2中调用文本编辑器NotePad++设置方法
  9. 软件测试之-------软件缺陷
  10. Web Worker