sql >> Databasteknik >  >> RDS >> Mysql

SQL - Vänsterkoppling av 2 främmande nycklar till 1 primärnyckel

Jag ser ofta att folk kämpar med idén att gå med i ett bord för sig själv eller flera gånger i samma fråga (som det var här). När den väl bemästras är det en fantastisk teknik att använda på bord som har många relationer mellan raderna (som en lista över lag som måste spela mot varandra!). Som andra har påpekat måste du använda två inner join s för att åstadkomma detta:

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

Så, om dina games tabellen ser ut så här:

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

Du kommer att få resultatuppsättningen:

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

Naturligtvis skulle jag kalla dessa kolumner i select uttalande, om jag var jag, för användbarhetens skull:

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

På så sätt kan kolumner namnges på lämpligt sätt, istället för att ha t1 och t2 kolumner har samma namn.

Nu, för att ta itu med förvirringen om vad en left join är. Du förstår, en left join tar alla rader från den första (eller vänster) tabellen och matchar sedan alla rader i kopplingsvillkoret med den andra (eller höger) tabellen. För alla rader från den vänstra tabellen får du null i alla kolumner till right bord.

Fördjupa oss i ett exempel, låt oss säga att någon lagt in en null för TeamID2 på en av raderna oavsett anledning. Låt oss också säga att ett team av TeamID 4 fanns förr, men finns inte längre.

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

Låt oss nu ta en titt på vad en left join skulle vara i termer av frågan:

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

Logiskt sett kommer detta att ta tag i alla våra games , och matcha dem sedan mot respektive teams . Men om ett TeamID inte existerar får vi null s. Det kommer att se ut så här:

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

Därför en left join kommer endast vara nödvändigt om ett lag är valfritt.

I ditt fall kommer du att använda en inner join att gå med i ett bord flera gånger. Detta är en mycket vanlig praxis och är ganska användbar. Det undviker några av fallgroparna med underfrågor (särskilt på MySQL), samtidigt som du kan ta data från tabellen för jämförelser mellan tabeller. Detta är mycket användbart när du försöker hitta ordningen på något, eller relaterade rader.

Hur som helst, jag hoppas att det här mycket stökiga svaret hjälper någon någonstans.



  1. Hibernate Named Query - gå med i 3 bord

  2. Undviker JTextField setTextupprepning runt programmet

  3. Hur kan jag fastställa installerade SQL Server-instanser och deras versioner?

  4. Få återstående dagar, timmar och minuter med mySql