Php 在MYSQL中连接多(4)个表

Php 在MYSQL中连接多(4)个表,php,sql,mysql,join,Php,Sql,Mysql,Join,我有四个表要联接并从中获取数据。这些桌子看起来像 员工(EmployeeID、GroupID[fk]、EmployeeName、PhoneNum) 职位(职位ID、职位名称) 员工职位(EployeePositionID、员工ID[fk],职位ID[fk]) EmployeeGroup(组ID、组名称) [fk]=外键 我想创建一个查询,返回有关员工的所有信息(由EmployeeID提供)。我需要一个查询,该查询将在一行中返回给定的员工姓名、职位和组 我认为它需要包含连接,但我不确定如何格式

我有四个表要联接并从中获取数据。这些桌子看起来像

  • 员工(EmployeeID、GroupID[fk]、EmployeeName、PhoneNum)
  • 职位(职位ID、职位名称)
  • 员工职位(EployeePositionID、员工ID[fk],职位ID[fk])
  • EmployeeGroup(组ID、组名称)
[fk]=外键

我想创建一个查询,返回有关员工的所有信息(由EmployeeID提供)。我需要一个查询,该查询将在一行中返回给定的员工姓名、职位和组


我认为它需要包含连接,但我不确定如何格式化查询。MYSQL的手册在技术上超出了我的理解。我将非常感谢您的帮助。

您似乎在SQL方面遇到了问题,而不是在mySQL方面。mySQL文档提供了有关各种SQL表达式的详细信息,但通常假定您对SQL有一定的了解。为了快速启动SQL,您可以考虑这一点。 您需要的查询如下所示

SELECT EmployeeName, PositionName, GroupName
FROM Employees E
LEFT JOIN EmployeePositions EP ON EP.EmployeeID = E.EmployeeID
LEFT JOIN Positions P ON P.PositionID = EP.PositionId
LEFT JOIN EmployeeGroup EG ON EG.GroupId = E.GroupId
WHERE E.EmployeeId = some_value
需要注意的几点:
当相应的表没有给定FK的值时,“LEFT JOIN”中的“LEFT”将导致生成NULL以代替PositionName或GroupName。(仅当数据被破坏时才会发生,例如,如果某些员工的GroupId为123,但不知何故该GroupId已从EmployeeGroup表中删除。
查询将为每个员工返回一行(1)。您可以使用其他搜索条件,例如WHERE EmployeeName='SMITH',并获得具有该名称的所有员工的列表。实际上,如果没有WHERE子句,您将获得在employees表中找到的所有员工的列表。
(1) 这是假设每个员工只能有一个职位。如果某些员工有多个职位(即给定EmployeeID的EmployeePositions中有多行),则每个员工都会有几行,名称和组会重复,并且有一个不同的职位名称

编辑
如果给定员工可以有多个职位,则可以使用Tor Valamo建议的查询,该查询使用GROUP by构造,并使用GROUP_CONCAT()在返回行的单个字段值中透视所有可能的职位

SELECT e.EmployeeID, e.EmployeeName, e.PhoneNum, 
       g.GroupName, GROUP_CONCAT(p.PositionName) AS Positions
FROM Employees e
  LEFT JOIN EmployeeGroup g ON g.GroupID = e.GroupID
  LEFT JOIN EmployeePositions ep ON ep.EmployeeID = e.EmployeeID
  LEFT JOIN Positions p ON p.PositionID = ep.PositionID
WHERE e.EmployeeID = 1
GROUP BY e.EmployeeID

以逗号分隔的字符串返回一行中的位置。

“MYSQL的手册在技术上超出了我的理解范围”-如果是这样的话,你为什么要写查询?你有SQL方面的背景吗?如果没有,这可能会很困难。或者只是一些奇怪的MySQL东西让你陷入困境?这个查询返回几行,而他想要一行。@Tor Valamo。如果数据与看上去的一样,那么上面的查询将为每个员工返回一行。(假设是:给定的员工只有一个职位,PositionId和GroupId查找会根据各自的ID返回一条记录)EmployeePositions是一种多对多关系。。。OP也这么说。“…将在一行中返回给定员工姓名、职位和组的查询。”mjv是正确的。虽然我认为如果有人在数据库中输入数据使其返回,可能会返回多行,但现实情况是不会出现这种情况。