1

ここでMySQLの戦士を呼んでいます。私の問題は、サブクエリの左外部結合内で外部クエリのテーブルへの参照を使用する必要があることです。これが不可能であることは知っていますが、サブクエリフィルタリングを外部クエリの一般的な結合に置き換える方法がわかりません。

私の問題を説明するために典型的な例を取り上げます。

オリンピックです。1人からN人の選手がいるチーム(卓球チームなど)がいくつかあります。2つのチーム間の試合は、すべてのプレーヤーが相手チームのすべてのプレーヤーと対戦したときに終了します。簡単に言えば、私は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 サブクエリのWHEREにLEFT OUTER JOINの2番目の条件を配置しようとしましたが、適切な結果が返されません。

これを達成する方法について何かアイデアはありますか?前もって感謝します

4

1 に答える 1

1
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

My_Team_IDに1を使用すると、次の結果が得られ、残りの一致が示されます。

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
于 2012-08-02T14:35:46.797 に答える