我有一个 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
最佳答案
单个查询返回单个结果集,而不是单独的结果集。
查询中的 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
session 变量的当前值派生的。
例如:
SHOW VARIABLES LIKE 'max_allowed_packet';
Variable_name Value
------------------ ---------
max_allowed_packet 1048576
所以这意味着GROUP_CONCAT返回的字符串可以超过1MB。
关于mysql - SQL组查询从两个表中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17691158/