Объединение нескольких (4) таблиц в MYSQL - PullRequest
0 голосов
/ 31 января 2010

У меня есть четыре таблицы, к которым я хочу присоединиться и получить данные. Таблицы выглядят примерно так ...

  • Сотрудники (EmployeeID, GroupID [ fk ], EmployeeName, PhoneNum)
  • Positions (PositionID, PositionName)
  • EmployeePositions (EployeePositionID, EmployeeID [ fk ], PositionID [ fk ])
  • EmployeeGroup (GroupID, GroupName)

[fk] = внешний ключ

Я хочу создать запрос, который будет возвращать всю информацию о сотруднике (предоставленную EmployeeID). Я хочу запрос, который будет возвращать имена сотрудников, должности и группы в одну строку.

Я думаю, что это должно включать в себя объединения, но я не уверен, как форматировать запросы. Руководство MYSQL является техническим вне моего понимания. Буду очень признателен за любую помощь.

Ответы [ 2 ]

6 голосов
/ 31 января 2010

Кажется, у вас проблемы с SQL вообще, а не с mySQL в частности. Документация по mySQL предоставляет подробную информацию о различных выражениях SQL, но обычно предполагает некоторое знакомство с SQL. Для быстрого начала работы с SQL вы можете рассмотреть этот учебник W3schools.com .
Вам нужен следующий запрос.

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

Несколько замечаний:
«LEFT» в «LEFT JOIN» приведет к получению NULL вместо PositionName или GroupName, когда соответствующие таблицы не имеют значения для данного FK. (Должно произойти, только если данные повреждены, скажем, если, например, некоторые сотрудники имеют GroupId 123, но каким-то образом этот groupid был удален из таблицы EmployeeGroup.
Запрос возвращает одну строку на сотрудника (1). Вы можете использовать альтернативные критерии поиска, например, WHERE EmployeeName = 'SMITH', и получить список всех сотрудников с таким именем. Действительно, без предложения WHERE вы получите список всех сотрудников, найденных в таблице «Сотрудники».
(1) это предполагает, что каждый сотрудник может иметь только одну должность. Если каким-либо образом некоторые сотрудники занимают более одной позиции (то есть несколько строк в EmployeePositions для данного EmployeeID), вы получите несколько строк на сотрудника, при этом имя и группа будут повторяться, а также будет отличаться PostionName.

Редактировать
Если у данного сотрудника может быть несколько должностей, вы можете использовать запрос, предложенный Tor Valamo, который использует конструкцию GROUP BY, с GROUP_CONCAT () для поворота всех возможных позиций в одном значении поля в возвращаемой строке.

1 голос
/ 31 января 2010
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

Возвращает позиции в строке через запятую в одной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...