2013-07-17 50 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 
相关问题