Mysql 自连接

922 阅读1分钟
  • 自连接不是一种新的连接形式,而只是一个表“自己跟自己连接”,这怎么做到呢?

    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.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 | 青岛      | 山东省    |
+----+-----------+-----------+