Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql从两个表中选择多个表,并将它们的结果连接到第三个表_Mysql_Select_Join - Fatal编程技术网

MySql从两个表中选择多个表,并将它们的结果连接到第三个表

MySql从两个表中选择多个表,并将它们的结果连接到第三个表,mysql,select,join,Mysql,Select,Join,我有三张桌子:球员,球员档案,比赛。玩家和玩家档案表的结构完全相同 在玩家和玩家档案中,我们有玩家ID和名字 在比赛中,我们有一排: RaceID、Record1PlayerID、Record2PlayerID、Record3PlayerID、Record4PlayerID和Record5PlayerID 任务是选择整个Races表,但它应该返回其名称,而不是球员ID字段 e、 g: 您的数据结构有两个问题。首先,你应该为每场比赛中的球员准备一个单独的表格,每个球员/比赛组合一行。将它们放

我有三张桌子:球员,球员档案,比赛。玩家和玩家档案表的结构完全相同

在玩家和玩家档案中,我们有玩家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;