Saya sering melihat orang-orang bergumul dengan gagasan untuk bergabung dengan tabel itu sendiri atau beberapa kali dalam kueri yang sama (seperti di sini). Setelah dikuasai, ini adalah teknik yang bagus untuk digunakan pada tabel yang memiliki banyak hubungan antar baris (seperti daftar tim yang harus bermain satu sama lain!). Seperti yang telah ditunjukkan orang lain, Anda perlu menggunakan dua inner join s untuk mencapai ini:
select
*
from
games g
inner join teams t1 on
g.teamid1 = t1.teamid
inner join teams t2 on
g.teamid2 = t2.teamid
Jadi, jika games your Anda tabel terlihat seperti ini:
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 2 1
Anda akan mendapatkan kumpulan hasil:
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
Tentu saja, saya akan membuat alias kolom ini di select pernyataan, jika saya adalah saya, demi kegunaan:
select
g.GameID,
t1.Name as Team1,
t2.Name as Team2
from
...
Dengan cara ini, kolom dapat diberi nama dengan tepat, daripada memiliki t1 dan t2 kolom memiliki nama yang sama.
Sekarang, untuk mengatasi kebingungan tentang apa itu left join adalah. Anda lihat, left join akan mengambil semua baris dari tabel pertama (atau kiri), dan kemudian mencocokkan setiap baris pada kondisi join ke tabel kedua (atau kanan). Untuk setiap baris dari tabel kiri, Anda akan mendapatkan null di semua kolom di right tabel.
Menggali sebuah contoh, katakanlah seseorang memasukkan null untuk TeamID2 di salah satu baris untuk alasan apa pun. Katakanlah juga bahwa tim TeamID 4 dulu ada, tapi sekarang tidak lagi.
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 1 null
Sekarang, mari kita lihat apa itu left join akan dalam hal permintaan:
select
*
from
games g
left join teams t1 on
g.teamid1 = t1.teamid
left join teams t2 on
g.teamid2 = t2.teamid
Logikanya, ini akan mengambil semua games kami , lalu mencocokkannya dengan teams masing-masing . Namun, jika TeamID tidak ada, kita akan mendapatkan null s. Ini akan terlihat seperti ini:
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
Oleh karena itu, left join akan hanya diperlukan jika tim bersifat opsional.
Dalam kasus Anda, Anda akan menggunakan inner join untuk bergabung dengan tabel beberapa kali. Ini adalah praktik yang sangat umum dan agak berguna. Ini menghindari beberapa jebakan subquery (terutama di MySQL), sementara memungkinkan Anda untuk mengambil data dari tabel untuk perbandingan intratable. Ini sangat berguna ketika mencoba menemukan urutan sesuatu, atau baris terkait.
Bagaimanapun, saya harap jawaban yang sangat bertele-tele ini membantu seseorang di suatu tempat.