Минимизация 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