我有一个department
表和user
表,显然每个员工都在不同的部门。
我希望分别获得每个部门的所有用户。我可以按小组或......来做吗?
我的尝试如下,但没有给我预期的结果:
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 :(得分: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
我建议您在GROUP_CONCAT中包含某种ORDER BY,以便结果具有确定性,并且不会因运行而异。
对于每个用户名,更理想的输出可能是单独的行。您可以使用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_packet”是基于字符数或实际大小的限制,如1MB,......?
答强>
GROUP_CONCAT()
函数返回的字符串长度有限。我认为限制是以字节(而不是字符)指定的,并且是从max_allowed_packet
会话变量的当前值派生的。
例如:
SHOW VARIABLES LIKE 'max_allowed_packet';
Variable_name Value
------------------ ---------
max_allowed_packet 1048576
所以这意味着GROUP_CONCAT返回的字符串可以超过1MB。
答案 1 :(得分: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