Mysql
 sql >> база данни >  >> RDS >> Mysql

SQL - Ляво свързване на 2 външни ключа към 1 първичен ключ

Често виждам хора да се борят с идеята да се присъединят към таблица сама по себе си или няколко пъти в една и съща заявка (както беше тук). Веднъж усвоена, това е страхотна техника за използване на маси, които имат много връзки между редовете (като списък с отбори, които трябва да играят един срещу друг!). Както посочиха други, трябва да използвате две inner join s, за да постигнете това:

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

Така че, ако вашите games таблицата изглежда така:

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

Ще получите набор от резултати от:

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

Разбира се, бих сложил псевдоними на тези колони в select изявление, ако бях на мое място, в името на използваемостта:

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

По този начин колоните могат да бъдат именувани по подходящ начин, вместо да имат t1 и t2 колоните споделят едни и същи имена.

Сега, за да се справим с объркването относно това какво е left join е. Виждате, left join ще вземе всички редове от първата (или лявата) таблица и след това ще съпостави всички редове на условието за присъединяване към втората (или дясна) таблица. За всички редове от лявата таблица ще получите null във всички колони в right таблица.

Задълбочавайки се в пример, да кажем, че някой е поставил null за TeamID2 на един от редовете по някаква причина. Да кажем също, че екип от TeamID 4 съществуваше, но вече не съществува.

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

Сега нека да разгледаме какво е left join би било по отношение на заявката:

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

Логично, това ще грабне всички наши games и след това ги съпоставете със съответните teams . Въпреки това, ако TeamID не съществува, ще получим null с. Ще изглежда така:

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

Следователно, left join ще само е необходимо, ако екипът не е задължителен.

Във вашия случай ще използвате inner join да се присъедините към маса няколко пъти. Това е много често срещана практика и е доста полезна. Той избягва някои от капаните на подзаявките (особено в MySQL), като същевременно ви позволява да вземете данни от таблицата за вътрешни сравнения в таблица. Това е изключително полезно, когато се опитвате да намерите реда на нещо или свързани редове.

Както и да е, надявам се, че този много бърз отговор ще помогне на някого някъде.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. показване на данни от sql от щракване върху svg карта

  2. Оптимизация на SQL заявки за избягване на временна таблица

  3. Стратегии за групово актуализиране на SQLAlchemy

  4. MySQL Case с вмъкване и актуализиране

  5. MYSQL изброяване:@rownum, нечетни и четни записи