我在这里呼吁MySQL勇士。我的问题是,我需要在子查询的左外连接中使用对外部查询表的引用。 我知道这是不可能的,但我不知道如何用外部查询中的典型联接替换子查询过滤。引用子查询中的外部查询JOIN
我会举一个典型的例子来说明我的问题。
这是奥运会,我有几支球队(比如说乒乓球队),其中有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
)
我已经把转储出于实用的目的:http://pastebin.com/HW3L5ukz 我试图把LEFT OUTER在子查询的WHERE JOIN的第二个条件,但它不会返回适当的结果。
有关如何实现这一点的任何想法? 在此先感谢
http://en.wikipedia.org/wiki/Correlated_subquery? – 2012-08-02 14:14:14
如果Game和Game_Player是单独的表格,这会更容易。 – 2012-08-02 14:15:10
@MarcB:我试过了,但没有返回正确的结果;如果我用我的p.id替换玩家的ID来单独键入我的子查询,它会起作用,但如果我将«LEFT OUTER JOIN p.id IN(game.playerA_id,game.playerB_id)»作为“WHERE p.id IN game.playerA_id,game.playerB_id)»,它没有。我做了一个测试,一个对手没有和所有人对阵过,另一个对手在左外接的情况下得到了我的球员 - 与在WHERE时相反。 – rgandoin 2012-08-02 14:23:18