2

我有一张department桌子和user一张桌子,很明显每个员工都在不同的部门。
我想分别获取每个部门的所有用户。我可以按 group by 还是...?

我的尝试如下,它没有给我想要的结果:

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
4

2 回答 2

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_pa​​cket”是基于字符数还是实际大小的限制,例如 1MB,...?

A:

函数返回的字符串GROUP_CONCAT()长度有限。我相信限制以字节(而不是字符)为单位指定,并且源自max_allowed_packet会话变量的当前值。

例如:

SHOW VARIABLES LIKE 'max_allowed_packet';

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

所以这意味着 GROUP_CONCAT 返回的字符串可以超过 1MB。

于 2013-07-17T04:41:54.470 回答
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
于 2013-07-17T04:50:10.917 回答