MySql从两个表中选择多个表,并将它们的结果连接到第三个表
我有三张桌子:球员,球员档案,比赛。玩家和玩家档案表的结构完全相同 在玩家和玩家档案中,我们有玩家ID和名字 在比赛中,我们有一排: RaceID、Record1PlayerID、Record2PlayerID、Record3PlayerID、Record4PlayerID和Record5PlayerID 任务是选择整个Races表,但它应该返回其名称,而不是球员ID字段 e、 g:MySql从两个表中选择多个表,并将它们的结果连接到第三个表,mysql,select,join,Mysql,Select,Join,我有三张桌子:球员,球员档案,比赛。玩家和玩家档案表的结构完全相同 在玩家和玩家档案中,我们有玩家ID和名字 在比赛中,我们有一排: RaceID、Record1PlayerID、Record2PlayerID、Record3PlayerID、Record4PlayerID和Record5PlayerID 任务是选择整个Races表,但它应该返回其名称,而不是球员ID字段 e、 g: 您的数据结构有两个问题。首先,你应该为每场比赛中的球员准备一个单独的表格,每个球员/比赛组合一行。将它们放
您的数据结构有两个问题。首先,你应该为每场比赛中的球员准备一个单独的表格,每个球员/比赛组合一行。将它们放在一行的不同列中是个坏主意 第二个问题是将名称放在两个不同的表中。从您的问题中,我无法判断
播放器
表和播放器存档
表是否都是必需的。因此,我假设不需要存档
解决方案是从races表连接到包含玩家信息的表:
select r.*,
p1.name as name1,
p2.name as name2,
p3.name as name3,
p4.name as name4,
p5.name as name5
from races r left outer join
players p1
on r.record1playerid = p1.playerid left outer join
players p2
on r.record1playerid = p2.playerid left outer join
players p3
on r.record1playerid = p3.playerid left outer join
players p4
on r.record1playerid = p4.playerid left outer join
players p5
on r.record1playerid = p5.playerid left outer join
如果数据确实在Players
和PlayersArchive
中,则Players
可能需要:
(select distinct playerid, name from ((select p.* from players) union all (select pa.* from playersarchive)) t) p1 . . .
这将两个表组合在一起以查找名称。这将仅演示一个可能的解决方案,以满足您的要求
Select RaceId, p1.Name AS Name1 From Races AS r
Left Join (
Select * From Players
Union Select * From PlayersArchive
) AS p1 On r.Record1PlayerID = p1.PlayerID;
您应该在查询中再重复4次左连接,以获得所有5个名称。
请注意,对于大数据,这可能需要很长时间才能执行。如果玩家和玩家档案表基本相同,那么为什么要将它们分开呢?(按照@fancyPants的说法…)除非您需要大量数据(即使是这样,也有一些方法可以进行扩展—您是否记得在连接中使用的字段中添加索引?),通过将播放器拆分到单独的存档表中,您将使事情变得更加复杂。
result:
1 Jack Jhon NULL NULL NULL
select r.*,
p1.name as name1,
p2.name as name2,
p3.name as name3,
p4.name as name4,
p5.name as name5
from races r left outer join
players p1
on r.record1playerid = p1.playerid left outer join
players p2
on r.record1playerid = p2.playerid left outer join
players p3
on r.record1playerid = p3.playerid left outer join
players p4
on r.record1playerid = p4.playerid left outer join
players p5
on r.record1playerid = p5.playerid left outer join
(select distinct playerid, name from ((select p.* from players) union all (select pa.* from playersarchive)) t) p1 . . .
Select RaceId, p1.Name AS Name1 From Races AS r
Left Join (
Select * From Players
Union Select * From PlayersArchive
) AS p1 On r.Record1PlayerID = p1.PlayerID;