2013-07-17 48 views
2

我有一個department表和user表,很明顯,每個員工在不同的部門。
我想分別獲取每個部門的所有用戶。我可以通過組或...來做到嗎?SQL組查詢從兩個表中獲取數據

我嘗試如下不給我想要的結果:

select username,b.deptName 
    from user a 
inner join dept b 
    on a.dept=deptId group by deptName 

PS:我需要一個SQL查詢來獲取不同部門的同事不是每個部門一個單獨的查詢!


樣本數據

User(Table) 

username dept 

John  1 
Jack  2  
Sam  1 
Tedy  1 
Tom  2 
Sara  2 

dept:(Table) 
deptId deptName 
1  HR 
2  IT 

My Desired result: 
HR:John-Sam-Tedy 
IT:Jack-Tom-Sara 
+0

請提供一些示例數據。您的問題很難理解? –

+0

可以提供一些樣本輸出? – Nithesh

+0

您是否在尋找'by by'而不是'Group by'? – bummi

回答

5

單個查詢返回單個結果集,而不是單獨的結果集。

查詢中的GROUP BY將消除大量的行。

如果您希望每個部門都有一行,那麼您可以使用GROUP_CONCAT功能,儘管它受到一些限制。 (最大長度由max_allowed_packet限制,你需要使用沒有出現在任何用戶名的字符分隔符。

SELECT b.deptName 
    , GROUP_CONCAT(a.username ORDER BY a.username ASC SEPARATOR '-') AS usernames 
    FROM user a 
    JOIN dept b 
    ON a.dept=b.deptId 
GROUP BY b.deptName 

我建議你包括某種形式的ORDER BY的在GROUP_CONCAT,這樣的結果將是確定性的,並且不會隨着運行而變化

更理想的輸出可能是每個用戶名的單獨一行您可以使用ORDER BY子句來獲取彼此相鄰的行的行,真的不是「獨立的」,但是這些行將被排序。

SELECT b.deptName 
    , a.username 
    FROM user a 
    JOIN dept b 
    ON a.dept=b.deptId 
ORDER BY b.deptName, a.username 

問:可否請您解釋一下「max_allowed_pa​​cket」是基於字符數量還是實際大小的限制,如1MB,...?

答:

GROUP_CONCAT()函數返回的串具有有限的長度。我相信限制是以字節(而不是字符)指定的,並且是從max_allowed_packet會話變量的當前值導出的。

例如:

SHOW VARIABLES LIKE 'max_allowed_packet'; 

Variable_name  Value  
------------------ --------- 
max_allowed_packet 1048576 

因此,這意味着通過GROUP_CONCAT返回的字符串可以超過1MB。

+0

非常感謝!你的第一個解決方案似乎是我一直在尋找的!但是,你能解釋一下,「max_allowed_pa​​cket」是基於字符數量還是像1MB這樣的實際大小的限制,......?因爲如果限制是基於我的情況罰款的實際大小,但我不確定的字符數量 –

+0

+1不錯的答案.. – Nithesh

+0

我喜歡你的答案,但它似乎在你的例子中的用戶名列超過了限制並沒有顯示我的數據庫中的所有用戶名:(我試圖增加限制,但沒有成功! –

0

嘗試使用STUFF作爲結果。 試試

SELECT D.department, 
    STUFF((
    SELECT '-'+ U1.userName 
    FROM user U1 inner join department D1 ON U1.dept_ID=D1.dept_ID 
    WHERE D1.deptName= D.deptName 
    FOR XML PATH('') 
    ) 
    ,1,0,'') AS users 
FROM user U inner join department D ON U.dept_ID=D.dept_ID 
GROUP BY D.deptName 
相關問題