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

标签 mysql sql sql-server sql-server-2008 t-sql

我有一个 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_pa​​cket 限制,并且您需要使用不会在任何用户名中显示为字符的分隔符。

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)的限制,...?

答:

GROUP_CONCAT() 函数返回的字符串长度有限。我相信限制是以字节(而不是字符)为单位指定的,并且是从 max_allowed_pa​​cket 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/

相关文章:

mysql - 根据同一表中的其他行更新行

mysql - 我可以创建 100 行 ID 从 1 到 100 的行而不将它们一一插入吗?

c# - 如何实际执行命令?

sql-server - 使用 SQL 在多个 View 中查找引用表

mysql支持xquery吗?

java - hibernate/ Spring : Lots (thousands) of open connections the database

python - 将 MySQL 查询转换为 Django 查询

java - 使用 SQL DB 的 Java 程序的资源注意事项

sql-server - 如何在 ROW_NUMBER() 函数和 Union 中获取 Filter 记录?

sql-server - UNION 和字面值,奇怪的结果