一尘不染

使用具有一对多关系的联接来最小化SQL查询

mysql

因此,让我以任何方式说我都不是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

最好的方法是像这样列出所有部门和每个部门的所有员工:

营业额

  • 汤姆
  • 法案
  • 雷切尔

营销学

  • 杰西卡(Jessica)
  • 约翰

假设两个表实际上都是巨大的。(我想避免获得部门列表,然后遍历结果并为每个部门进行单独查询)。当状态和注释存储在单独的表中时,类似于在类似Facebook的系统中选择状态/注释的思考。


阅读 271

收藏
2020-05-17

共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
2020-05-17