MySQL:如何在同一张表内关联ID列与BossID列查询员工上下级关系
嘿,我来帮你理清这个问题~
你之前写的select * from mytable where ID = BossID为啥没结果?因为这个语句是在找自己当自己直属上司的员工,但你的数据里根本没有这样的记录(所有员工的BossID都不等于自己的ID),当然查不到东西啦。
要实现员工和直属上司的对应关系,我们得用表的自连接(Self Join)——简单说就是把同一张表既当作「员工表」,又当作「上司表」来关联查询。
正确的SQL语句
如果想同时显示员工信息和其直属上司的姓名(这样更直观看到对应关系),可以用这个:
SELECT e.ID AS EmployeeID, e.Name AS EmployeeName, e.BossID, b.Name AS BossName FROM mytable e LEFT JOIN mytable b ON e.BossID = b.ID
语句解释:
- 给表起两个别名:
e代表员工(Employee),b代表上司(Boss),这样能区分开同一张表的两个角色 LEFT JOIN保证哪怕某个员工没有上司(比如BossID为NULL的情况)也能被查出来;如果你的数据里所有员工都有对应的上司,换成INNER JOIN也可以- 核心关联条件
e.BossID = b.ID,就是把员工的直属上司ID和上司表中的ID对应起来,这样就能匹配到每个员工的上司信息
如果你的需求只是筛选出确实存在直属上司的员工(也就是你给出的期望结果里的John、Max、Peter,排除Alex这种上司ID不存在的情况),用INNER JOIN就刚好:
SELECT e.ID, e.Name, e.BossID, b.Name AS BossName FROM mytable e INNER JOIN mytable b ON e.BossID = b.ID
这个语句返回的结果里,就能清晰看到:
- John的上司是Peter(ID=3)
- Max和Peter的上司是Alex(ID=4)
内容的提问来源于stack exchange,提问作者Beto A. Lien
相关产品推荐
相关产品推荐

