Tôi thường thấy mọi người đấu tranh với ý tưởng kết hợp một bảng với chính nó hoặc nhiều lần trong cùng một truy vấn (như ở đây). Khi đã thành thạo, đó là một kỹ thuật tuyệt vời để sử dụng trên các bảng có nhiều mối quan hệ giữa các hàng (chẳng hạn như danh sách các đội phải chơi với nhau!). Như những người khác đã chỉ ra, bạn cần sử dụng hai inner join
s để thực hiện điều này:
select
*
from
games g
inner join teams t1 on
g.teamid1 = t1.teamid
inner join teams t2 on
g.teamid2 = t2.teamid
Vì vậy, nếu games
của bạn bảng trông như thế này:
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 2 1
Bạn sẽ nhận được tập hợp kết quả là:
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
Tất nhiên, tôi sẽ đặt bí danh cho các cột này trong select
tuyên bố, nếu tôi là tôi, vì lợi ích của khả năng sử dụng:
select
g.GameID,
t1.Name as Team1,
t2.Name as Team2
from
...
Bằng cách này, các cột có thể được đặt tên thích hợp, thay vì có t1
và t2
các cột có cùng tên.
Bây giờ, để giải quyết sự nhầm lẫn về những gì left join
Là. Bạn thấy đấy, một left join
sẽ lấy tất cả các hàng từ bảng đầu tiên (hoặc bên trái), sau đó so khớp bất kỳ hàng nào theo điều kiện nối với bảng thứ hai (hoặc bên phải). Đối với bất kỳ hàng nào từ bảng bên trái, bạn sẽ nhận được null
trong tất cả các cột ở right
bảng.
Đi sâu vào một ví dụ, giả sử rằng ai đó đã đặt một null
cho TeamID2
trên một trong các hàng vì bất kỳ lý do gì. Cũng giả sử rằng một nhóm TeamID
4 đã từng tồn tại, nhưng không còn nữa.
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 1 null
Bây giờ, hãy xem left join
là gì sẽ là về mặt truy vấn:
select
*
from
games g
left join teams t1 on
g.teamid1 = t1.teamid
left join teams t2 on
g.teamid2 = t2.teamid
Về mặt logic, điều này sẽ lấy tất cả games
của chúng tôi , và sau đó so khớp chúng với các teams
tương ứng . Tuy nhiên, nếu một TeamID
không tồn tại, chúng tôi sẽ nhận được null
S. Nó sẽ giống như vậy:
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
Do đó, một left join
sẽ chỉ cần thiết nếu một nhóm là tùy chọn.
Trong trường hợp của bạn, bạn sẽ sử dụng inner join
để tham gia một bảng nhiều lần. Đây là một thực tế rất phổ biến và khá hữu ích. Nó tránh một số cạm bẫy của các truy vấn con (đặc biệt là trên MySQL), đồng thời cho phép bạn lấy dữ liệu từ bảng để so sánh không thể tìm được. Điều này rất hữu ích khi cố gắng tìm thứ tự của một thứ gì đó hoặc các hàng có liên quan.
Dù sao, tôi hy vọng câu trả lời rất lan man này sẽ giúp ích cho ai đó ở đâu đó.