5

假设我的 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

4 回答 4

8

我认为你需要使用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 演示

于 2012-09-05T05:59:53.157 回答
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
于 2012-09-05T05:59:04.920 回答
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

如果您使用 a left outer jointhen,即使团队没有经理或成员,您也会得到结果。如果您只想要有成员和经理的团队,您可以使用inner join.

于 2012-09-05T06:00:01.800 回答
-1

使用以下定义定义一个名为 vTeam 的视图:

SELECT dbo.Team.TeamID, dbo.EMP.EmpName AS Manager, EMP_1.EmpName AS Member, 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 左外连接 dbo.EMP ON dbo.Team.ManagerID = dbo.EMP.EmpID

此查询将为您提供结果:

SELECT TeamID, Manager, MemberList = STUFF(( SELECT ',' + Member FROM vTeam as xx WHERE xx.TeamID = x.TeamID and 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 亚历克斯·约翰、亚历克斯、汤姆

于 2012-09-05T06:23:05.147 回答