mysql 分类表设计,MYSQL无限级分类表设计及自我连接

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来指向父节点呢?我们来看看下面这张表。

e0e9505fc6e16bade863c14a172f47e1.png

就这张表而言,你能看出什么来?能看出成都是四川下的一个 市么?所以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;

结果如下:

84bc02f81fe57ba59125b08dd307632b.png

其中

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

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

MYSQL无限级分类表设计及自我连接

标签:sql   昆明   为什么   weight   城市   join   logs   arch   联动

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:http://www.cnblogs.com/hzStudy/p/7287723.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值