Summary: 如何使用 MySQL self join 进行表的 自己对自己的join操作。.
前面的教程,已经教过join语法,都是两个表的之间的操作,特殊的,当一个表自己和自己进行join,那就需要self join语法了。
在使用同一个表的行合并,就用到 self join 需要将表命名为可区分两个不同的表,然后就形成了两个表,这样就可以继承上节中介绍的两个表的所有join操作。
MySQL self join 实例:
在员工雇佣表内,不仅存了员工的信息,而且还有组织结构数据, The reportsto 列为员工的汇报上级领导。
想得到员工的信息并且得到汇报上级的信息,恰恰用到了self join,信息在同一个表
SELECT CONCAT(m.lastname, ', ', m.firstname) AS 'Manager', CONCAT(e.lastname, ', ', e.firstname) AS 'Direct report' FROM employees e INNER JOIN employees m ON m.employeeNumber = e.reportsto ORDER BY manager;
这里用的inner join 的self join,根据业务逻辑,最高领导人不会出现在这表里,为最高领导人没有领导,那么,我们用left join来解决这个问题。
SELECT IFNULL(CONCAT(m.lastname, ', ', m.firstname), 'Top Manager') AS 'Manager', CONCAT(e.lastname, ', ', e.firstname) AS 'Direct report' FROM employees e LEFT JOIN employees m ON m.employeeNumber = e.reportsto ORDER BY manager DESC;
用left join的self join,如果最高领导的为空,那么直接领导人为Top manager,
实例2:
找出同一城市的相同客户;
SELECT c1.city, c1.customerName, c2.customerName FROM customers c1 INNER JOIN customers c2 ON c1.city = c2.city AND c1.customername > c2.customerName ORDER BY c1.city;
1.城市作为共同信息
2.客户编号不同,保证不要客户与客户自己进行匹配。