MySQL:如何通过单查询关联另一表两列获取对应员工姓名列数据
一次查询获取关联员工姓名的正确方法
你的原始查询存在几个关键问题,导致它无法正常运行:
- 子查询
(select employeename from A, B where A.employeeid = B.fromemployeeid)可能返回多条结果,而标量子查询只能返回单个值,这会直接触发报错 - 列名写错了:
B.toEmployeeid = A.id中的A.id应该是A.Employeeid——你的Table A里根本没有id这个列 - 直接用
A, B的方式做表连接会产生笛卡尔积,导致结果重复且不符合预期
根据你的需求(从Table A获取与Table B中toEmployeeId和fromEmployeeId关联的姓名),这里提供两种常用的解决方案:
方案1:展示Table B每条记录对应的双方员工姓名
如果想清晰看到Table B中每条关联记录的接收方和发送方姓名,你需要两次关联Table A,并给它起不同的别名来区分:
SELECT B.toEmployeeid AS ToEmployeeID, to_emp.EmployeeName AS ToEmployeeName, B.fromEmployeeid AS FromEmployeeID, from_emp.EmployeeName AS FromEmployeeName FROM TableB B JOIN TableA to_emp ON B.toEmployeeid = to_emp.Employeeid JOIN TableA from_emp ON B.fromEmployeeid = from_emp.Employeeid;
说明:
- 给Table A分别起别名
to_emp(对应接收方)和from_emp(对应发送方),避免表名冲突 - 使用
JOIN(内连接)会只返回Table B中在Table A有对应ID的记录;如果允许Table B存在未在Table A注册的员工ID,可以把JOIN改成LEFT JOIN,这样即使没有匹配的姓名也会保留记录
方案2:从Table A出发,展示每个员工作为接收方对应的所有发送方姓名
如果你的需求是以Table A的员工为主体,显示每个员工收到过哪些人的消息(可能多个),可以用聚合函数来合并结果:
MySQL版本:
SELECT A.Employeeid, A.EmployeeName, GROUP_CONCAT(from_emp.EmployeeName SEPARATOR ', ') AS FromEmployeeNames FROM TableA A LEFT JOIN TableB B ON A.Employeeid = B.toEmployeeid LEFT JOIN TableA from_emp ON B.fromEmployeeid = from_emp.Employeeid GROUP BY A.Employeeid, A.EmployeeName;
PostgreSQL/SQL Server版本:
-- PostgreSQL SELECT A.Employeeid, A.EmployeeName, STRING_AGG(from_emp.EmployeeName, ', ') AS FromEmployeeNames FROM TableA A LEFT JOIN TableB B ON A.Employeeid = B.toEmployeeid LEFT JOIN TableA from_emp ON B.fromEmployeeid = from_emp.Employeeid GROUP BY A.Employeeid, A.EmployeeName; -- SQL Server SELECT A.Employeeid, A.EmployeeName, STRING_AGG(from_emp.EmployeeName, ', ') WITHIN GROUP (ORDER BY from_emp.EmployeeName) AS FromEmployeeNames FROM TableA A LEFT JOIN TableB B ON A.Employeeid = B.toEmployeeid LEFT JOIN TableA from_emp ON B.fromEmployeeid = from_emp.Employeeid GROUP BY A.Employeeid, A.EmployeeName;
说明:
- 使用
LEFT JOIN确保即使某个员工从未被任何人发送消息(Table B中无对应记录),也会出现在结果里 - 聚合函数
GROUP_CONCAT/STRING_AGG会把所有对应的发送方姓名合并成一个以逗号分隔的字符串,方便查看
内容的提问来源于stack exchange,提问作者Fakipo
相关产品推荐
相关产品推荐

