Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL. So verwenden Sie Self Join

Du bist so nah dran!

Da Sie sagen, dass Sie das Land und das Jahr von A anzeigen und durch A. Country der Türkei, die Türkei ist alles, was Sie sehen werden. Sie müssen entweder die Auswahl auf B.country ändern und B.year oder ändern Sie die where-Klausel in B.country .

Dies verwendet einen Cross-Join, der langsamer wird, je mehr Datensätze in einer Tabelle vorhanden sind.

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

könnte geschrieben werden als... und hätte wahrscheinlich denselben Ausführungsplan.

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

ODERDies verwendet einen INNER JOIN, der die Arbeit begrenzt, die die Engine leisten muss, und nicht unter Leistungseinbußen leidet, die ein Cross Join erleiden würde.

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

WARUM:

Überlegen Sie, was die SQL-Engine tun wird, wenn der Join auftrittA 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  |
+------------+------+--------+------------+------+--------+ 

Also, wenn Sie sagten, zeigen Sie A.Country an und A.Year wobei A.Country die Türkei ist, können Sie sehen, dass alles, was es zurückgeben kann, die Türkei ist (aufgrund der Unterscheidung nur 1 Datensatz)

Aber wenn Sie B.Country machen ist die Türkei und zeigen Sie A.Country an , erhalten Sie Frankreich, Kanada und die Türkei!