2010-03-15 53 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