sql >> Databáze >  >> RDS >> Mysql

MySql. Jak používat Self Join

Jste tak blízko!

Protože říkáte, že zobrazujete zemi a rok od A a omezujete A. Country Turecka, Turecko je vše, co uvidíte. Buď musíte změnit výběr na B.country a B.year nebo změňte klauzuli where na B.country .

Toto používá křížové spojení, které bude pomalejší, čím více záznamů bude v tabulce.

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

by mohl být napsán jako... a pravděpodobně by měl stejný plán provádění.

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

NEBOToto používá INNER JOIN, které omezuje práci, kterou motor musí dělat, a netrpí zhoršením výkonu, které by způsobilo křížové spojení.

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

PROČ:

Zvažte, co udělá stroj SQL, když dojde ke spojení A 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  |
+------------+------+--------+------------+------+--------+ 

Takže když jste řekl zobrazit A.Country a A.Year kde A.Country je Turecko, můžete vidět vše, co se může vrátit, je Turecko (kvůli odlišnému pouze 1 záznamu)

Ale pokud uděláte B.Country je Turecko a zobrazí se A.Country , získáte Francii, Kanadu a Turecko!



  1. Jaký je nejrychlejší způsob, jak zkrátit časová razítka na 5 minut v Postgres?

  2. Odstraňování problémů při práci s datem a časem na serveru SQL Server

  3. WooCommerce serializované pole meta hodnot v tabulce wp_postmeta

  4. Chyba jiného serveru mysqld běžícího na portu 3306