sql >> Database teknologi >  >> RDS >> Mysql

SQL - Venstre sammenføjning af 2 fremmednøgler til 1 primærnøgle

Jeg ser ofte folk kæmper med ideen om at slutte sig til et bord for sig selv eller flere gange i den samme forespørgsel (som det var her). Når det først er mestret, er det en fantastisk teknik at bruge på borde, der har mange relationer mellem rækkerne (såsom en liste over hold, der skal spille mod hinanden!). Som andre har påpeget, skal du bruge to inner join s for at opnå dette:

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

Så hvis dine games tabellen ser sådan ud:

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

Du vil få resultatsættet af:

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

Selvfølgelig ville jeg kalde disse kolonner i select erklæring, hvis jeg var mig, for brugervenlighedens skyld:

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

På denne måde kan kolonner navngives passende i stedet for at have t1 og t2 kolonner deler de samme navne.

For nu at løse forvirringen om, hvad en left join er. Ser du, en left join vil tage alle rækkerne fra den første (eller venstre) tabel og derefter matche alle rækker på join-betingelsen med den anden (eller højre) tabel. For alle rækker fra den venstre tabel får du null i alle kolonnerne til right tabel.

Lad os dykke ned i et eksempel, og lad os sige, at nogen har indsat en null for TeamID2 på en af ​​rækkerne uanset årsagen. Lad os også sige, at et team af TeamID 4 plejede at eksistere, men gør det ikke mere.

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

Lad os nu tage et kig på, hvad en left join ville være i forhold til forespørgslen:

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

Logisk set vil dette fange alle vores games , og match dem derefter til de respektive teams . Men hvis et TeamID ikke eksisterer, får vi null s. Det vil se sådan ud:

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

Derfor en left join vil kun være nødvendigt, hvis et hold er valgfrit.

I dit tilfælde vil du bruge en inner join at deltage i et bord flere gange. Dette er en meget almindelig praksis og er ret nyttig. Det undgår nogle af faldgruberne ved underforespørgsler (især på MySQL), mens det giver dig mulighed for at få fat i data fra tabellen til sammenligninger i tabellen. Dette er markant nyttigt, når du prøver at finde rækkefølgen af ​​noget eller relaterede rækker.

Jeg håber i hvert fald, at dette meget omstændelige svar kan hjælpe nogen et sted.



  1. Tilføj dynamisk en kolonne med flere værdier til enhver tabel ved hjælp af en PL/pgSQL-funktion

  2. Antal udførte MySQL-forespørgsler på side

  3. MS-Access Recordset og klassemodul

  4. Webrick er meget langsom til at reagere. Hvordan fremskyndes det?