Mysql
 sql >> Baza danych >  >> RDS >> Mysql

SQL - lewe połączenie 2 kluczy obcych z 1 kluczem podstawowym

Często widzę, jak ludzie borykają się z pomysłem dołączenia tabeli do siebie lub wielu razy w tym samym zapytaniu (tak jak tutaj). Po opanowaniu jest to świetna technika do wykorzystania na stołach, które mają wiele relacji między rzędami (takich jak lista drużyn, które muszą ze sobą grać!). Jak zauważyli inni, musisz użyć dwóch inner join aby to osiągnąć:

select
    *
from
    games g
    inner join teams t1 on
        g.teamid1 = t1.teamid
    inner join teams t2 on
        g.teamid2 = t2.teamid

Tak więc, jeśli twoje games tabela wygląda tak:

GameID    TeamID1    TeamID2
----------------------------
     1          1          3
     2          4          2
     3          2          1

Otrzymasz zestaw wyników:

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

Oczywiście aliasowałbym te kolumny w select oświadczenie, gdybym był mną, ze względu na użyteczność:

select
    g.GameID,
    t1.Name as Team1,
    t2.Name as Team2
from
    ...

W ten sposób kolumny można odpowiednio nazwać, zamiast mieć t1 i t2 kolumny mają te same nazwy.

Teraz, aby rozwiązać zamieszanie związane z tym, co left join jest. Widzisz, left join pobierze wszystkie wiersze z pierwszej (lub lewej) tabeli, a następnie dopasuje wszystkie wiersze warunku złączenia do drugiej (lub prawej) tabeli. Dla dowolnych wierszy z lewej tabeli otrzymasz null we wszystkich kolumnach po right tabela.

Zagłębiając się w przykład, powiedzmy, że ktoś umieścił null dla TeamID2 w jednym z rzędów z jakiegokolwiek powodu. Załóżmy również, że zespół TeamID 4 kiedyś istniały, ale już nie ma.

GameID    TeamID1    TeamID2
----------------------------
     1          1          3
     2          4          2
     3          1       null

Przyjrzyjmy się teraz, co left join byłoby w zakresie zapytania:

select
    *
from
    games g
    left join teams t1 on
        g.teamid1 = t1.teamid
    left join teams t2 on
        g.teamid2 = t2.teamid

Logicznie, to złapie wszystkie nasze games , a następnie dopasuj je do odpowiednich teams . Jeśli jednak TeamID nie istnieje, otrzymamy null s. Wygląda to tak:

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

Dlatego left join będzie tylko być konieczne, jeśli zespół jest opcjonalny.

W twoim przypadku użyjesz inner join aby wielokrotnie dołączyć do stołu. Jest to bardzo powszechna praktyka i jest raczej przydatna. Pozwala uniknąć niektórych pułapek związanych z podzapytaniami (zwłaszcza w MySQL), jednocześnie umożliwiając pobieranie danych z tabeli do porównań między tabelami. Jest to bardzo przydatne, gdy próbujesz znaleźć kolejność czegoś lub powiązanych wierszy.

W każdym razie mam nadzieję, że ta bardzo chaotyczna odpowiedź gdzieś komuś pomoże.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL odrębna liczba, jeśli warunki są unikalne

  2. 1 pod ma niezwiązane natychmiastowe PersistentVolumeClaims na Minikube

  3. Wprowadzenie do przełączania awaryjnego dla replikacji MySQL — blog 101

  4. Błąd PHP (MySQL):Ostrzeżenie:mysql_num_rows() oczekuje, że parametr 1 będzie zasobem

  5. Długie migracje Django 1.7 nigdy się nie kończą