MySQL查询:在一行中以逗号分隔的字符串连接表和显示记录

时间:2012-09-05 05:54:33

标签: mysql sql join

假设我的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行,其中包含以逗号分隔的所有团队成员。

如果有更好的方法来设计这两个表,那么请同时建议。非常感谢。

感谢。

4 个答案:

答案 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 ),...

SQLFiddle Demo

答案 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