【问题标题】:Joining multiple (4) tables in MYSQL在 MYSQL 中连接多个 (4) 表
【发布时间】:2010-01-31 03:44:09
【问题描述】:

我有四个表要加入并从中获取数据。这些表看起来像......

  • 员工(EmployeeID、GroupID[fk]、EmployeeName、PhoneNum)
  • 职位(PositionID、PositionName)
  • EmployeePositions(EployeePositionID、EmployeeID[fk]、PositionID[fk])
  • EmployeeGroup(GroupID、GroupName)

[fk] = 外键

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

我认为它需要涉及连接,但我不确定如何格式化查询。 MYSQL 的手册在技术上超出了我的理解。如果有任何帮助,我将不胜感激。

【问题讨论】:

  • “MYSQL 的手册在技术上超出了我的理解”——如果是这样,你为什么要编写查询?
  • 你有任何的SQL背景吗?如果没有,这可能很困难。还是只是一些奇怪的 MySQL 东西让你卡住了?

标签: php sql mysql join


【解决方案1】:

一般来说,您似乎在使用 SQL 时遇到问题,而不是在使用 mySQL 时遇到问题。 mySQL 的文档提供了有关各种 SQL 表达式的详细信息,但通常假定您对 SQL 有一定的了解。要快速开始使用 SQL,您可以考虑W3schools.com primer
您需要的查询如下。

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 子句,您将获得在员工表中找到的所有员工的列表。
(1) 假设每个员工只能担任一个职位。如果某些员工有多个职位(即,给定 EmployeeID 的 EmployeePositions 中的多行),您将得到每个员工的多行,名称和组重复,并且有一个不同的 PostionName。

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

【讨论】:

  • 这个查询返回几行,而他想要一行。 ;)
  • @Tor Valamo。如果数据看起来应该是这样,上面的查询将返回每个员工一行。 (假设是:给定员工只有一个职位,并且 PositionId 和 GroupId 查找根据各自的 ID 分别返回一条记录)
  • EmployeePositions 是多对多的关系......而且 OP 也这么说。 “...一个查询将返回给定的员工姓名、职位在一行中的组。”
  • mjv 是正确的。尽管我认为如果有人在数据库中输入数据以使其返回多行,则可能会返回多行,但现实情况是不会发生这种情况。
【解决方案2】:
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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多