私はよく、テーブルをそれ自体に結合したり、同じクエリで複数回結合したりするというアイデアに苦労している人をよく見かけます(ここにあるように)。習得したら、行間に多くの関係があるテーブル(互いにプレイする必要のあるチームのリストなど)で使用するのは優れたテクニックです。他の人が指摘しているように、2つのinner join
を使用する必要があります sこれを達成するために:
select
*
from
games g
inner join teams t1 on
g.teamid1 = t1.teamid
inner join teams t2 on
g.teamid2 = t2.teamid
つまり、games
の場合 テーブルは次のようになります:
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 2 1
次の結果セットが表示されます:
g.GameID g.TeamID1 g.TeamID2 t1.TeamID t1.Name t2.TeamID t2.Name
----------------------------------------------------------------------------------
1 1 3 1 Lions 3 Bears
2 4 2 4 Oh My 2 Tigers
3 2 1 2 Tigers 1 Lions
もちろん、select
でこれらの列のエイリアスを作成します 使いやすさのために、私が私だった場合のステートメント:
select
g.GameID,
t1.Name as Team1,
t2.Name as Team2
from
...
このようにして、t1
を使用する代わりに、列に適切な名前を付けることができます。 およびt2
列は同じ名前を共有します。
ここで、left join
についての混乱に対処します。 は。ほら、left join
最初の(または左の)テーブルからすべての行を取得し、結合条件のすべての行を2番目の(または右の)テーブルに一致させます。左側のテーブルの行については、null
を取得します right
のすべての列 テーブル。
例を掘り下げて、誰かがnull
を入れたとしましょう TeamID2
の場合 何らかの理由で行の1つに。 TeamID
のチームも 4は以前は存在していましたが、現在は存在しません。
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 1 null
それでは、left join
とは何かを見てみましょう。 クエリの観点から:
select
*
from
games g
left join teams t1 on
g.teamid1 = t1.teamid
left join teams t2 on
g.teamid2 = t2.teamid
論理的には、これによりすべてのgames
が取得されます 、次にそれらをそれぞれのteams
に一致させます 。ただし、TeamID
存在しない場合は、null
を取得します s。次のようになります:
g.GameID g.TeamID1 g.TeamID2 t1.TeamID t1.Name t2.TeamID t2.Name
----------------------------------------------------------------------------------
1 1 3 1 Lions 3 Bears
2 4 2 null null 2 Tigers
3 1 null 1 Lions null null
したがって、left join
のみ チームがオプションの場合は必要です。
あなたの場合、inner join
を使用します テーブルを複数回結合します。これは非常に一般的な方法であり、かなり便利です。これにより、サブクエリ(特にMySQL)の落とし穴のいくつかを回避しながら、テーブル内の比較のためにテーブルからデータを取得できます。これは、何かの順序や関連する行を見つけようとするときに非常に役立ちます。
とにかく、この非常にとりとめのない答えがどこかで誰かを助けることを願っています。