zoukankan      html  css  js  c++  java
  • MYSQL无限级分类表设计及自我连接

    我们有这样一个需求:

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

    用一张表来实现。

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

    如何用一张表来存储呢?

    该表的建立代码如下:

     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 on
     p.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,郑州)

    完全显示出来,子表的数据显示为空。
  • 相关阅读:
    linux 中字符映射错误,#、、|、“ 不能输入
    Qt::Key_Return Qt::Key_Enter 区别
    如何监控系统用户实时执行的Linux命令
    a3考卷转2张a4
    kali
    字典序最小问题(贪心)
    nmap 目标指定
    debian 系统安装最新版本nmap方法:
    TransCAD是由美国Caliper公司开发的一套强有力的交通规划和需求预测软件
    GIS 地图的图层(切片/瓦片)概念
  • 原文地址:https://www.cnblogs.com/hzStudy/p/7287723.html
Copyright © 2011-2022 走看看