![](/img/trans.png)
[英]mysql combine multiple columns in each row into a single column in each row
[英]MySQL: Combine multiple row values into single column?
数据库:MySQL
表:团队
TeamID INT
TeamName VARCHAR(20)
表:人
PeopleID INT
FirstNameID INT
LastNameID INT
表:TeamMembers
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,所以我不可能有三个子查询,因为只有三个团队成员。 我在网上看起来很轻松,但是我总是在这里得到最好,最彻底的答案。 任何想法或建议,请让我知道。 老实说,我不知道从哪里开始。 谢谢。
我猜想这些人的名字实际上存储在某个地方,因为您只是将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;
请参阅带有Demo的SQL Fiddle ,它将产生结果:
| 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;
结果:
| TEAMNAME | TEAMMEMBERS |
---------------------------------------------------
| Team INsanity | 761 566/87 784/187 465/5463 763 |
| Team Xstream | 976 8762/376 2134/1351 453 |
您没有在表中提供实际存储名称的信息,但您正在寻找的是GROUP_CONCAT
函数。 这就是您用来显示名字和姓氏ID的方式。 我将把它留给您加入名称表,并将查询中的名称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表中具有名称值? 这将节省您向查询中添加第四个表(如果名字和姓氏在不同的表中,则可能会增加第五个表)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.