Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL - Left Join 2 Fremdschlüssel zu 1 Primärschlüssel

Ich sehe oft Leute, die mit der Idee kämpfen, eine Tabelle mit sich selbst oder mehrmals in derselben Abfrage zu verbinden (sozusagen hier). Einmal gemeistert, ist es eine großartige Technik, die man an Tischen anwenden kann, die viele Beziehungen zwischen den Reihen haben (z. B. eine Liste von Teams, die gegeneinander spielen müssen!). Wie andere bereits betont haben, müssen Sie zwei inner join verwenden s um dies zu erreichen:

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

Also, wenn Ihre games Tabelle sieht so aus:

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

Sie erhalten die Ergebnismenge von:

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

Natürlich würde ich diese Spalten im select aliasieren Aussage, wenn ich ich wäre, der Benutzerfreundlichkeit halber:

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

Auf diese Weise können Spalten angemessen benannt werden, anstatt den t1 zu haben und t2 Spalten haben dieselben Namen.

Nun, um die Verwirrung darüber anzusprechen, was ein left join ist ist. Sie sehen, ein left join nimmt alle Zeilen aus der ersten (oder linken) Tabelle und gleicht dann alle Zeilen der Join-Bedingung mit der zweiten (oder rechten) Tabelle ab. Für alle Zeilen aus der linken Tabelle erhalten Sie null in allen Spalten right Tabelle.

Um uns ein Beispiel anzusehen, nehmen wir an, jemand hat einen null eingegeben für TeamID2 in einer der Reihen aus welchem ​​Grund auch immer. Nehmen wir auch an, dass ein Team von TeamID 4 gab es früher, gibt es aber nicht mehr.

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

Schauen wir uns nun an, was ein left join ist wäre in Bezug auf die Abfrage:

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

Logischerweise werden dadurch alle unsere games erfasst , und ordnen Sie sie dann den jeweiligen teams zu . Wenn jedoch eine TeamID nicht existiert, erhalten wir null s. Es sieht so aus:

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

Daher ein left join wird nur erforderlich sein, wenn ein Team optional ist.

In Ihrem Fall verwenden Sie einen inner join sich mehrmals an einen Tisch setzen. Dies ist eine sehr gängige Praxis und ziemlich nützlich. Es vermeidet einige der Fallstricke von Unterabfragen (insbesondere bei MySQL), während Sie gleichzeitig Daten aus der Tabelle für intratable-Vergleiche abrufen können. Dies ist ausgesprochen nützlich, wenn Sie versuchen, die Reihenfolge von etwas oder verwandten Zeilen zu finden.

Wie auch immer, ich hoffe, diese sehr weitschweifige Antwort hilft jemandem irgendwo.