私はよく、テーブルをそれ自体に結合したり、同じクエリで複数回結合したりするというアイデアに苦労している人をよく見かけます(ここにあるように)。習得したら、行間に多くの関係があるテーブル(互いにプレイする必要のあるチームのリストなど)で使用するのは優れたテクニックです。他の人が指摘しているように、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)の落とし穴のいくつかを回避しながら、テーブル内の比較のためにテーブルからデータを取得できます。これは、何かの順序や関連する行を見つけようとするときに非常に役立ちます。
とにかく、この非常にとりとめのない答えがどこかで誰かを助けることを願っています。