Минимизация SQL-запросов с использованием соединения "один-ко-многим"

Итак, позвольте мне предисловие к этому, сказав, что я не мастер SQL каким-либо образом. То, что я хочу сделать, просто, как концепция, но представило мне небольшую проблему, пытаясь свести к минимуму количество запросов к базе данных, которые я выполняю.

Скажем, у меня есть таблица отделов. В каждом отделе есть список сотрудников.

Каков наиболее эффективный способ перечисления всех отделов и сотрудников в каждом отделе.

Так например, если у меня есть таблица отдела с:

id   name
1    sales
2    marketing

И таблица людей с:

id   department_id   name
1    1               Tom
2    1               Bill
3    2               Jessica
4    1               Rachel
5    2               John

Каков наилучший способ перечислить все отделы и всех сотрудников для каждого отдела:

Продажа

  • Том
  • Билл
  • Рейчел

Маркетинг

  • Джессика
  • Джон

Притвориться, что обе таблицы действительно массивные. (Я хочу избежать получения списка отделов, а затем перебирать результат и делать индивидуальный запрос для каждого отдела). Подумайте также о выборе статусов/комментариев в Facebook-подобной системе, когда статусы и комментарии хранятся в отдельных таблицах.

Ответ 1

Вы можете получить все это в одном запросе с простым соединением, например:

SELECT   d.name AS 'department', p.name AS 'name'
FROM     department d
  LEFT JOIN people p ON p.department_id = d.id
ORDER BY department

Это возвращает все данные, но это немного боль, чтобы потреблять, так как вам все равно придется проходить через каждого человека. Вы можете пойти дальше и объединить их вместе:

SELECT   d.name AS 'department',
         GROUP_CONCAT(p.name SEPARATOR ', ') AS 'name'
FROM     department d
  LEFT JOIN people p ON p.department_id = d.id
GROUP BY department

В результате вы получите что-то вроде этого:

department | name
-----------|----------------
sales      | Tom, Bill, Rachel
marketing  | Jessica, John

Ответ 2

SELECT d.name, p.name
FROM department d
JOIN people p ON p.department_id = d.id

Я также предлагаю прочитать учебник по объединению SQL или три. Это очень распространенная и очень простая концепция SQL, которую вы должны понимать полностью.

Ответ 3

Обычно это выполняется в одном запросе:

SELECT DepartmentTable.Name, People.Name from DepartmentTable 
INNER JOIN People
ON DepartmentTable.id = People.department_id
ORDER BY DepartmentTable.Name

Это приведет к подавлению пустых отделов. Если вы хотите показать пустые отделы, измените INNER на LEFT OUTER