Mysql 对子查询联接中外部查询的引用

Mysql 对子查询联接中外部查询的引用,mysql,join,subquery,Mysql,Join,Subquery,我在这里为MySQL战士打电话。我的问题是,我需要在子查询的左外部联接中使用对外部查询表的引用。 我知道这是不可能的,但我不知道如何用外部查询中的典型连接替换子查询过滤 我将举一个典型的例子来说明我的问题 这是奥运会,我有几个队(比如乒乓球队),其中有1到N名运动员。 两队之间的比赛在其所有球员都与对方队的所有球员进行了比赛后结束。 简言之,我有3张表: Team (id, country); Player (id, team_id, name) Game (id, playerA_id,

我在这里为MySQL战士打电话。我的问题是,我需要在子查询的左外部联接中使用对外部查询表的引用。 我知道这是不可能的,但我不知道如何用外部查询中的典型连接替换子查询过滤

我将举一个典型的例子来说明我的问题

这是奥运会,我有几个队(比如乒乓球队),其中有1到N名运动员。 两队之间的比赛在其所有球员都与对方队的所有球员进行了比赛后结束。 简言之,我有3张表:

Team (id, country); 
Player (id, team_id, name) 
Game (id, playerA_id, playerB_id).
我想搜索所有在每场比赛中都没有或没有对对方球队的所有球员(显然不在我队)提出异议的球员。 我的问题是:

SELECT t.*, p.*
FROM player p
INNER JOIN team t ON t.id = p.team_id AND t.id != My_Team_ID
WHERE EXISTS (
    -- If an opposing team's player has played no game => game.id is NULL
    -- If he hasn't played against all of my teammates => there will be at least one row where game.id is NULL
    SELECT *
    FROM player
    INNER JOIN team ON team.id = player.team_id AND team.id = My_Team_ID
    LEFT OUTER JOIN game ON player.id IN (game.playerA_id, game.playerB_id) AND p.id IN (game.playerA_id, game.playerB_id)
    WHERE game.id IS NULL
)
出于实用目的,我设置了一个垃圾场: 我试图将左外部联接的第二个条件放在子查询的WHERE中,但它没有返回正确的结果

你知道如何实现这一目标吗? 提前谢谢

SELECT p1.*, p2.*
FROM player p1
JOIN team t1
  ON t1.id = p1.team_id AND t1.id = My_Team_ID
LEFT JOIN player p2
  ON p2.id != p1.id
JOIN team t2
  ON t2.id = p2.team_id AND t2.id != My_Team_ID
LEFT JOIN game g1
  ON (g1.playerA_id = p1.id OR g1.playerB_id = p1.id)
  AND (g1.playerA_id = p2.id OR g1.playerB_id = p2.id)
WHERE g1.id IS NULL
如果我使用1作为我的团队ID,我会得到以下结果,显示剩余的匹配项:

id  team_id name            id  team_id     name
1   1       Laurent Dupuis  6   2           Alec Russell
2   1       Stéphane Leroy  6   2           Alec Russell
3   1       Julien le Guen  4   2           Mark Johnsson
3   1       Julien le Guen  6   2           Alec Russell
如果我使用1作为我的团队ID,我会得到以下结果,显示剩余的匹配项:

id  team_id name            id  team_id     name
1   1       Laurent Dupuis  6   2           Alec Russell
2   1       Stéphane Leroy  6   2           Alec Russell
3   1       Julien le Guen  4   2           Mark Johnsson
3   1       Julien le Guen  6   2           Alec Russell

?如果游戏和玩家是分开的,这会更容易。@MarcB:我试过了,但没有得到正确的结果;如果我通过用玩家id替换我的p.id来单独键入子查询,它会工作,但是如果我将«左外连接p.id IN(game.playerA_id,game.playerB_id)»作为«WHERE p.id IN(game.playerA_id,game.playerB_id)»,它不会工作。我做了一个测试,其中一个对手没有和所有人比赛,而另一个对手有,在左外联的条件下,我得到了我的球员-与在何处相反。@MarcusAdams:这只是为了简化问题,制作两个单独的表有什么意义?Game只是一个链接表如果Game_Player将Game_id和Player_id作为列,如果您想查找特定玩家所在的游戏,可以在Game_Player中查询单个列,而不是游戏中的两列。如果游戏和游戏玩家是分开的,这会更容易。@MarcB:我试过了,但没有返回正确的结果;如果我通过用玩家id替换我的p.id来单独键入子查询,它会工作,但是如果我将«左外连接p.id IN(game.playerA_id,game.playerB_id)»作为«WHERE p.id IN(game.playerA_id,game.playerB_id)»,它不会工作。我做了一个测试,其中一个对手没有和所有人比赛,而另一个对手有,在左外联的条件下,我得到了我的球员-与在何处相反。@MarcusAdams:这只是为了简化问题,制作两个单独的表有什么意义?游戏只是一个链接表如果游戏玩家有游戏id和玩家id作为列,如果你想找到某个特定玩家参与的游戏,你可以在游戏玩家中查询一个列,而不是两个列。谢谢马库斯,它就像一个符咒。事实上,我真正的问题有点复杂,所以我开始变得更加复杂。但是通过这个简单的例子和你的答案,它看起来很明显。谢谢马库斯,它就像一个魅力。事实上,我真正的问题有点复杂,所以我开始变得更加复杂。但有了这个简单的例子和你的答案,它看起来很明显。