Shi*_*Mdz 2 mysql sql t-sql sql-server sql-server-2008
我有一张department桌子和user桌子,显然每个员工都在不同的部门.
我希望分别获得每个部门的所有用户.我可以按小组或......来做吗?
我的尝试如下,但没有给我预期的结果:
select username,b.deptName
from user a
inner join dept b
on a.dept=deptId group by deptName
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
单个查询返回单个结果集,而不是单独的结果集.
查询中的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
Run Code Online (Sandbox Code Playgroud)
我建议你在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
Run Code Online (Sandbox Code Playgroud)
问:请你解释一下"max_allowed_packet"是基于字符数或实际大小的限制,如1MB,......?
A:
GROUP_CONCAT()函数返回的字符串长度有限.我认为限制是以字节(而不是字符)指定的,并且是从max_allowed_packet会话变量的当前值派生的.
例如:
SHOW VARIABLES LIKE 'max_allowed_packet';
Variable_name Value
------------------ ---------
max_allowed_packet 1048576
Run Code Online (Sandbox Code Playgroud)
所以这意味着GROUP_CONCAT返回的字符串可以超过1MB.
| 归档时间: |
|
| 查看次数: |
1300 次 |
| 最近记录: |