2010-03-15 45 views
10

因此,让我通过说我不是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

+1可试图摆脱势在必行的程序员的循环思维。这非常值得。 – spender 2010-03-15 23:07:23

回答

11

你可以得到它在一个单一的查询用一个简单的连接,如:

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 
+0

这正是我需要的东西的类型。感谢有关GROUP BY和GROUP_CONCAT的信息。正是我在找什么。 – Brian 2010-03-15 23:07:29

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

我建议你也读一个SQL Join tutorial或三个。这是一个非常常见且非常基本的SQL概念,您应该彻底理解。

+0

那是一个垒球,不是吗? – JohnFx 2010-03-15 22:57:14

0

这是在一个单一的查询正常完成:

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

这将抑制空白部门。如果您想要显示空白部门,请将INNER更改为LEFT OUTER

+0

-1:此查询只选择部门。 – hobodave 2010-03-15 23:07:36

+0

嗯,什么?这将返回两个表中的所有列,不是?但只要我在这里,我会添加一个ORDER BY,并明确字段名称... – egrunin 2010-03-15 23:17:20