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.