问题 使用具有一对多关系的连接最小化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的系统中选择状态/注释。


2240
2018-03-15 22:50


起源

+1试图摆脱命令式程序员的循环思维模式。这非常值得。 - spender


答案:


您可以使用简单连接在单个查询中获取所有内容,例如:

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

12
2018-03-15 23:00



这正是我需要的东西。感谢有关GROUP BY和GROUP_CONCAT的信息。正是我在寻找什么。 - Brian


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

我建议也读一读 SQL Join教程 或者三个。这是一个非常常见且非常基本的SQL概念,您应该彻底了解它。


1
2018-03-15 22:55



那是垒球不是吗? - JohnFx


这通常在单个查询中完成:

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

这将压制空部门。如果要显示空部门,请更改 INNER 至 LEFT OUTER


0
2018-03-15 23:02



-1:此查询仅选择部门。 - hobodave
嗯什么?这将返回两个表中的所有列,不是吗?但只要我在这里,我将添加一个ORDER BY并使字段名称显式... - egrunin