【问题标题】:SQL group query to get data from two tableSQL组查询从两个表中获取数据
【发布时间】:2013-07-15 11:55:14
【问题描述】:

我有一个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

【问题讨论】:

  • 请提供一些示例数据。您的问题难以理解?
  • 你能提供一些示例输出吗?
  • 您是否在寻找Order by 而不是Group by
  • 不是最清楚的问题,Shima。鉴于您想要记录部门和员工的每个组合,只需删除您的 group by 子句。如果这不是您想要的,您可能需要重新措辞。为什么不给我们一些示例数据和所需的输出?
  • 谢谢!我添加了我的示例数据!

标签: mysql sql sql-server sql-server-2008 tsql


【解决方案1】:

单个查询返回单个结果集,而不是单独的结果集。

查询中的 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,...?

答:

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

例如:

SHOW VARIABLES LIKE 'max_allowed_packet';

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

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

【讨论】:

  • 非常感谢!您的第一个解决方案似乎是我一直在寻找的!但是您能否解释一下“max_allowed_pa​​cket”是基于字符数或实际大小的限制,例如 1MB,...?因为如果限制是基于适合我的情况的实际大小,但我不确定的字符数
  • 我喜欢您的回答,但您的示例中的用户名列似乎超出了限制,并且它没有显示我数据库中的所有用户名:( 我试图增加限制但没有成功!
【解决方案2】:

尝试使用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

【讨论】:

    猜你喜欢
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    相关资源
    最近更新 更多