mysql - 如何将表引用到自身以带回员工记录和提供 empId 的经理
问题描述
我不知道如何为此编写查询。我在考虑一个表联合或左表连接,但我什至不知道如何开始
员工表
容纳员工和经理
- EmpId 是唯一的
- mgrId 是 empId 的外键
.
empId mgrId name
--------------------not in table 1 0 TheBoss (deleted)
22 1 John
22 1 John
22 1 John
22 1 John
22 1 John
45 1 Steve
45 1 Steve
68 1 Rudy
56 22 Lucy
77 22 Mack
78 45 Carlos
79 45 Juan
80 22 James
81 -- Bob (Bob is staff, but has not been assigned a Manager
82 22 Mike
83 22 Jack
68 1 Rudy (Rudy is a Manager but no one reports to him)
如果经理 John(22) 被选中
- 预计返回 6 条记录,包括他自己的经理
如果经理史蒂夫(45)被选中
- 预计返回 3 条记录,包括他自己的经理
如果员工 Lucy(56) 被选中
- 预计返回 2 条记录,包括她自己的员工
如果鲁迪经理(68 岁)被选中
- 预计返回 1 条记录,因为还没有人向他报告
如果员工 Bob(81) 被选中
- 预计返回 1 条记录,因为他还没有经理
解决方案
SELECT DISTINCT empId, mgrId, name
FROM table
WHERE @needed_id IN (empId, mgrId)
或者
SELECT DISTINCT t1.empId, t1.mgrId, t1.name
FROM table t1
JOIN table t2 ON t2.empId IN (t1.empId, t1.mgrId)
WHERE t2.name = @needed_name
PS。如果存在相同name
但不同的行,empId
则第二个查询不适用。
推荐阅读
- java - 执行命令时如何获取所有错误?
- azure - 如何使用 powershell 找出 Azure VM 使用的 Windows 版本?
- pyspark - 如何使用 Map/Reduce 或任何其他方法查找 rdd 的每列的 MIN 和 MAX
- python - 在 python 中合并 2 个模型对象并提供未显示在一行中的数据(使用数据表列出来自 db 的数据)
- c# - 捕获不是类型的异常
- javascript - Vue.js $emit 事件触发但什么也没发生
- assembly - 尝试使用 int 13h ah=02h 加载扇区时,如何修复错误“找不到媒体类型”?
- javascript - 如何使用松露测试代码可靠地读取公共变量?
- javascript - JS/jQuery:将 td 的内容复制到剪贴板
- php - 如何修复'trim()期望参数1是字符串,给定数组'在Router.php第560行:?