- 自连接不是一种新的连接形式,而只是一个表“自己跟自己连接”,这怎么做到呢? 1、自连接其实还是两个表连接,只是将一个表用不同的别名,当做两个表。 2、自连接适用于一个表中的某个字段的值“来源于”当前表的另一个字段的情况。
语法形式: select * from 表名1 as a [连接形式] join 表名1 as b on a.字段名=b.字段名;
连接形式 可以看下 join 连接查询。
- 测试数据:
mysql> select * from area; +----+-----------+-----------+ | id | name | parent_id | +----+-----------+-----------+ | 1 | 北京市 | 0 | | 2 | 河北省 | 0 | | 3 | 山东省 | 0 | | 4 | 海淀区 | 1 | | 5 | 保定 | 2 | | 6 | 衡水 | 2 | | 7 | 济南 | 3 | | 8 | 青岛 | 3 | +----+-----------+-----------+
``` 要求查询每个城市所在的省份 mysql> select * from area as a left join area as b on a.parentid=b.id where a.parentid>0; +----+-----------+-----------+------+-----------+-----------+ | id | name | parentid | id | name | parentid | +----+-----------+-----------+------+-----------+-----------+ | 4 | 海淀区 | 1 | 1 | 北京市 | 0 | | 5 | 保定 | 2 | 2 | 河北省 | 0 | | 6 | 衡水 | 2 | 2 | 河北省 | 0 | | 7 | 济南 | 3 | 3 | 山东省 | 0 | | 8 | 青岛 | 3 | 3 | 山东省 | 0 | +----+-----------+-----------+------+-----------+-----------+
mysql> select a.id, a.name as 地区, b.name as 省份 from area as a left join area as b on a.parentid=b.id where entid>0; +----+-----------+-----------+ | id | 地区 | 省份 | +----+-----------+-----------+ | 4 | 海淀区 | 北京市 | | 5 | 保定 | 河北省 | | 6 | 衡水 | 河北省 | | 7 | 济南 | 山东省 | | 8 | 青岛 | 山东省 | +----+-----------+-----------+ ```