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

MySql. Sådan bruger du Self Join

Du er så tæt på!

Da du siger, at du viser landet og året fra A og begrænser med A. Country af Tyrkiet, Tyrkiet er alt, hvad du kommer til at se. Du skal enten ændre valgene til at være B.country og B.year eller ændre where-sætningen til at være B.country .

Dette bruger en cross join, som bliver langsommere, jo flere poster der er i en tabel.

SELECT DISTINCT b.Country, b.Year 
FROM table1 AS a, 
     table1 AS b 
WHERE a.Year=b.Year 
  and a.Country='Turkey';
 

kunne skrives som... og ville sandsynligvis have den samme udførelsesplan.

SELECT DISTINCT b.Country, b.Year 
FROM table1 AS a 
CROSS JOIN table1 AS b 
WHERE a.Year=b.Year 
  and a.Country='Turkey';
 

ELLER Dette bruger en INNER JOIN, som begrænser det arbejde, motoren skal udføre og ikke lider af ydeevneforringelse, som en krydsforbindelse ville.

SELECT DISTINCT a.Country, a.Year 
FROM table1 AS a 
INNER JOIN table1 AS b 
   on a.Year=b.Year 
  and b.Country='Turkey';
 

HVORFOR:

Overvej, hvad SQL-motoren vil gøre, når joinforbindelsen skerA B

+------------+------+--------+------------+------+--------+ | A.Country | Rank | Year | B.Country | Rank | Year | +------------+------+--------+------------+------+--------+ |France | 55 | 2000 |France | 55 | 2000 | +------------+------+--------+------------+------+--------+ |Canada | 30 | 2000 |France | 55 | 2000 | +------------+------+--------+------------+------+--------+ |Turkey | 78 | 2000 |France | 55 | 2000 | +------------+------+--------+------------+------+--------+ |France | 55 | 2000 |Canada | 30 | 2000 | +------------+------+--------+------------+------+--------+ |Canada | 30 | 2000 |Canada | 30 | 2000 | +------------+------+--------+------------+------+--------+ |Turkey | 78 | 2000 |Canada | 30 | 2000 | +------------+------+--------+------------+------+--------+ |France | 55 | 2000 |Turkey | 78 | 2000 | +------------+------+--------+------------+------+--------+ |Canada | 30 | 2000 |Turkey | 78 | 2000 | +------------+------+--------+------------+------+--------+ |Turkey | 78 | 2000 |Turkey | 78 | 2000 | +------------+------+--------+------------+------+--------+

Så da du sagde vis A.Country og A.Year hvor A.Country er Tyrkiet, kan du se alt, hvad det kan returnere, er Tyrkiet (på grund af den distinkte kun 1 post)

Men hvis du gør B.Country er Tyrkiet og viser A.Country , får du Frankrig, Canada og Tyrkiet!



  1. Sum rækker fra forskellige forhold i Mysql

  2. MySQL OPRET TABEL, HVIS IKKE FINDER -> Fejl 1050

  3. ved hjælp af en miljøvariabel til lokal efterfølgerkonfiguration

  4. hvordan man undslipper skilletegnet fra kolonneindholdet ved eksport af csv