SQL组查询从两个表中获取数据

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)

spe*_*593 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
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_pa​​cket"是基于字符数或实际大小的限制,如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.