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