2

数据库:MySQL

表:团队

TeamID    INT
TeamName  VARCHAR(20)

表:人

PeopleID   INT
FirstNameID INT
LastNameID  INT

表:团队成员

TeamID  INT
PeopleID  INT

表示例:团队

TeamID       TeamName
1            Team Xstream
2            Team INsanity

表示例:人员

PeopleID   FirstNameID   LastNameID
1          1351          453
2          5463          763
3          976           8762
4          87            784
5          187           465
6          761           566
7          376           2134

表示例:TeamMembers

TeamID       PeopleID
1            1
1            3
1            7
2            2
2            4
2            5
2            6

期望的输出:

TeamName       TeamMembers
Team Xstream   John Smith/Jane Doe/Daniel Davis
Team INsanity  Sally Sue/Tom Thomas/Jack Jones/Harry Henderson

每个团队不会有固定数量的 TeamMembers,所以我不可能有三个子查询,因为只有三个团队成员。我在网上随便看看,但我总是在这里得到最好和最彻底的答案。任何想法或指示,请告诉我。老实说,我不知道从哪里开始。谢谢。

4

2 回答 2

4

考虑到您只是将 ID 号显示为姓名,我猜这些人的姓名实际上存储在某个地方。但是你会想要同时使用CONCAT()GROUP_CONCAT()来获得这个结果。第一步,将连接所有表并使用CONCAT()函数:

select t.teamname,
 concat(p.FirstNameId, ' ', p.LastNameId) teamMembers
from teams t
left join teammembers m
  on t.teamid = m.teamid
left join people p
  on m.peopleid = p.peopleid;

请参阅SQL Fiddle with Demo,它将产生结果:

|      TEAMNAME | TEAMMEMBERS |
-------------------------------
|  Team Xstream |    1351 453 |
|  Team Xstream |    976 8762 |
|  Team Xstream |    376 2134 |
| Team INsanity |    5463 763 |
| Team INsanity |      87 784 |
| Team INsanity |     187 465 |
| Team INsanity |     761 566 |

获得数据后,应用GROUP_CONCAT()函数和GROUP BY团队名称:

select t.teamname,
  group_concat(concat(p.FirstNameId, ' ', p.LastNameId) SEPARATOR '/') teamMembers
from teams t
left join teammembers m
  on t.teamid = m.teamid
left join people p
  on m.peopleid = p.peopleid
group by t.teamname;

请参阅带有演示的 SQL Fiddle

结果:

|      TEAMNAME |                     TEAMMEMBERS |
---------------------------------------------------
| Team INsanity | 761 566/87 784/187 465/5463 763 |
|  Team Xstream |      976 8762/376 2134/1351 453 |
于 2012-11-06T22:02:03.073 回答
1

您没有提供有关实际存储名称的表的信息,但您正在寻找的是GROUP_CONCAT功能。这就是您将如何使用它来显示名字和姓氏的方式。我将留给您加入名称表并将查询中的名称 id 字段替换为实际名称字段。

SELECT t.TeamName, GROUP_CONCAT(CONCAT(p.FirstNameID, ' ', p.LastNameID))
FROM Teams as t
INNER JOIN TeamMembers as tm on t.TeamID = tm.TeamID
INNER JOIN People as p on tm.PeopleID = p.PeopleID
GROUP BY t.TeamName

顺便说一句,将名称规范化到他们自己的表中并使用 nameID 似乎可能是过度规范化的一个很好的例子。为什么不在 People 表中有名称值?这将节省您在查询中添加第四个表(如果名字和姓氏在不同的表中,可能还有第五个表)。

于 2012-11-06T22:09:34.040 回答