Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Mój SQL. Jak korzystać z Self Join

Jesteś tak blisko!

Ponieważ mówisz, że wyświetlasz kraj i rok z A i ograniczasz przez A. Country Turcji, Turcja to wszystko, co zobaczysz. Musisz zmienić wybrane na B.country i B.year lub zmień klauzulę WHERE na B.country .

Jest to użycie łączenia krzyżowego, które będzie stawać się wolniejsze, im więcej rekordów jest w tabeli.

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

mógłby być napisany jako... i prawdopodobnie miałby taki sam plan wykonania.

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

ORTo używa INNER JOIN, które ogranicza pracę, którą musi wykonać silnik, i nie cierpi z powodu pogorszenia wydajności, które miałoby miejsce przy łączeniu krzyżowym.

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

DLACZEGO:

Zastanów się, co zrobi silnik SQL, gdy nastąpi złączenieA 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  |
+------------+------+--------+------------+------+--------+ 

Więc kiedy powiedziałeś wyświetl A.Country i A.Year gdzie A.Country to Turcja, widać, że wszystko, co może zwrócić, to Turcja (ze względu na wyróżniający się tylko 1 rekord)

Ale jeśli zrobisz B.Country jest Turcja i wyświetla A.Country , dostaniesz Francję, Kanadę i Turcję!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Brak wyników po usunięciu mysql ft_stopword_file

  2. MySQL jak uzupełnić brakujące daty w zakresie?

  3. Laravel Eloquent zapytanie JSON kolumna z Where In?

  4. Jak zainstalować Adminer we własnej aplikacji?

  5. Czy ktoś może polecić dobry samouczek dotyczący indeksów MySQL, w szczególności gdy jest używany w klauzuli order by podczas łączenia?