Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySql. Comment utiliser l'auto-adhésion

Vous êtes si proche !

Puisque vous dites que vous affichez le pays et l'année à partir de A et que vous limitez par A. Country de la Turquie, la Turquie est tout ce que vous allez voir. Vous devez soit changer les sélections pour être B.country et B.year ou changez la clause where en B.country .

Cela utilise une jointure croisée qui deviendra plus lente plus il y a d'enregistrements dans une table.

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

pourrait être écrit comme... et aurait probablement le même plan d'exécution.

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

ORThis utilise un INNER JOIN qui limite le travail que le moteur doit faire et ne souffre pas de la dégradation des performances qu'une jointure croisée pourrait subir.

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

POURQUOI :

Considérez ce que le moteur SQL fera lorsque la jointure se produitA 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  |
+------------+------+--------+------------+------+--------+ 

Donc, quand vous avez dit afficher A.Country et A.YearA.Country est la Turquie, vous pouvez voir que tout ce qu'il peut renvoyer est la Turquie (en raison du seul enregistrement distinct)

Mais si vous faites B.Country est la Turquie et affichez A.Country , vous aurez la France, le Canada et la Turquie !