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

MySql. Come usare Self Join

Sei così vicino!

Dal momento che dici che stai visualizzando il paese e l'anno da A e limitando da A. Country della Turchia, la Turchia è tutto ciò che vedrai. È necessario modificare le selezioni in modo che siano B.country e B.year o cambia la clausola where in B.country .

Questo sta usando un cross join che diventerà più lento più record ci sono in una tabella.

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

potrebbe essere scritto come... e probabilmente avrebbe lo stesso piano di esecuzione.

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

O Questo utilizza un INNER JOIN che limita il lavoro che il motore deve fare e non soffre del degrado delle prestazioni che farebbe un cross join.

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

PERCHE':

Considera cosa farà il motore SQL quando si verifica il joinA 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  |
+------------+------+--------+------------+------+--------+ 

Quindi quando hai detto mostra A.Country e A.Year dove A.Country è la Turchia, puoi vedere tutto ciò che può restituire è la Turchia (a causa del distinto solo 1 record)

Ma se fai B.Country è la Turchia e mostra A.Country , avrai Francia, Canada e Turchia!