Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

SQL - Nối trái 2 khóa ngoại thành 1 khóa chính

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ó t1t2 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 đó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tổng hợp số lần nhấp và lượt xem quảng cáo

  2. C #, MySQL - lỗi nghiêm trọng gặp phải trong quá trình thực thi lệnh - Đã kiểm tra các giải pháp khác, điều gì đó tôi đang thiếu

  3. Cách giải quyết org.hibernate.QueryException:Không phải tất cả các tham số được đặt tên đều bị lỗi?

  4. Lỗi phân tích cú pháp XML:rác sau phần tử tài liệu

  5. truy vấn mysql để nhận số lượng theo nhóm và tổng số