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,郑州)
完全显示出来,子表的数据显示为空。
MYSQL无限级分类表设计及自我连接
标签:sql 昆明 为什么 weight 城市 join logs arch 联动