假设我的MySQL数据库中有以下两个表:
Table 1:: EMP: EmpID, EmpName
eg. (1, 'John'), (2,'Alex'),(3,'Tom')
Table 2:: Team: TeamID, ManagerID, MemberID
eg. record1: (Team1, 1, 2), record2: (Team1, 1, 3)
所以有一个团队有id team1,John是经理,Alex和Tom是其成员。
我想以下列方式在屏幕上显示Team表的记录
| Team | Manager | Members |
| team1 | John | Alex, Tom |
什么是SQL查询,它将加入上述两个表,并在基于memberID时返回成员的名称。
此外,结果将显示为1行,其中包含以逗号分隔的所有团队成员。
如果有更好的方法来设计这两个表,那么请同时建议。非常感谢。
感谢。
答案 0 :(得分:6)
我认为您需要使用 GROUP_CONCAT
。 GROUP_CONCAT()
函数用于将列值连接成单个字符串。如果您以其他方式执行多行的查找,然后在客户端连接它们,这将非常有用。
SELECT b.TeamID as TeamName,
a.EmpName as Manager,
GROUP_CONCAT(c.EmpName) Members
FROM Emp a
INNER JOIN Team b
ON a.EmpID = b.ManagerID
INNER JOIN Emp c
ON b.MemberID = c.EmpID
GROUP BY b.TeamID, a.EmpName
您还可以更改分隔符和排序
GROUP_CONCAT( c.EmpName SEPARATOR '-' ),...
GROUP_CONCAT( c.EmpName ORDER BY c.EmpName DESC ),...
答案 1 :(得分:0)
使用GROUP_CONCAT(expr),您可以尝试类似
的内容此函数返回带有连接非NULL的字符串结果 一组中的值。如果没有非NULL值,则返回NULL。 组中值之间的默认分隔符是逗号(“,”)。
SELECT t.TeamID Team,
m.EmpName manager,
GROUP_CONCAT(mem.EmpName) Members
FROM Team t INNER JOIN
Emp m ON t.ManagerID = m.EmpID INNER JOIN
Emp mem ON t.MemberID = mem.EmpID
GROUP BY t.TeamID Team,
m.EmpName
答案 2 :(得分:0)
您需要加入EMP
表两次并使用group_concat
单独列出成员。
select TeamID as Team,
e2.EmpName as Manager,
group_concat(e1.EmpName) as Members
from Team t
left outer join EMP e1 on t.MemberID = e1.EmpID
left outer join EMP e2 on t.ManagerID = e2.EmpID
group by TeamID
如果您使用left outer join
,那么即使没有团队的经理或成员,您也会获得结果。如果您只想要有成员和经理的团队,您可以使用inner join
。
答案 3 :(得分:-1)
使用此定义定义名为vTeam的视图:
SELECT dbo.Team.TeamID,dbo.EMP.EmpName AS Manager,EMP_1.EmpName AS成员,EMP_1.EmpID AS MemberID,dbo.EMP.EmpID AS ManagerID FROM dbo.EMP AS EMP_1 RIGHT OUTER JOIN dbo.Team ON EMP_1.EmpID = dbo.Team.MemberID LEFT OUTER JOIN dbo.EMP ON dbo.Team.ManagerID = dbo.EMP.EmpID
此查询将为您提供结果:
SELECT TeamID,Manager,MemberList = STUFF(( SELECT','+成员从vTeam作为xx WHERE xx.TeamID = x.TeamID和x.Manager = xx.Manager FOR XML PATH(''),TYPE)。value('。[1]','nvarchar(max)'),1,1,'')FROM dbo.vTeam AS x GROUP BY TeamID,Manager;
Team1约翰亚历克斯,汤姆 Team2 Alex John,Alex,Tom