MySQL. Как использовать Самостоятельное присоединение

#mysql #sql

Вопрос:

Мне нужно использовать Self Join в этой таблице.

  ------------ ------ -------- 
| Country    | Rank |  Year  |
 ------------ ------ -------- 
|France      |  55  |  2000  |
 ------------ ------ -------- 
|Canada      |  30  |  2000  |
 ------------ ------ --------  
|Liberia     |  59  |  2001  |
 ------------ ------ --------  
|Turkey      |  78  |  2000  |
 ------------ ------ --------  
|Japan       |  65  |  2003  |
 ------------ ------ -------- 
|Romania     |  107 |  2001  |
 ------------ ------ -------- 
 

Мне нужно использовать self join, чтобы узнать, какие страны имеют тот же год, что и Турция.
Отображение только страны и года.

Это то, что я пытаюсь сделать.

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

^ погуглил самостоятельное присоединение и сделал это.

Я получаю только Индейку. Что я делаю не так?

Комментарии:

1. 1 за попытку и поиск в Интернете. jsut change a.страна` к b.country .

2. Этот запрос похож на SELECT Country, Year FROM table1 WHERE Country='Turkey'; то, почему вы получаете только Турцию

Ответ №1:

Ты так близко!

Поскольку вы говорите, что показываете страну и год от А до я Турции, Турция-это все, что вы увидите. A. Country Вам нужно либо изменить выбор, чтобы быть B.country и B.year , либо изменить предложение where, чтобы быть B.country .

При этом используется перекрестное соединение, которое будет становиться медленнее, чем больше записей будет в таблице.

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

может быть написано как… и, вероятно, будет иметь тот же план выполнения.

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

или
При этом используется ВНУТРЕННЕЕ СОЕДИНЕНИЕ, которое ограничивает работу, которую должен выполнять движок, и не страдает от снижения производительности, как при перекрестном соединении.

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

почему?:

Рассмотрим, что будет делать механизм SQL, когда произойдет соединение 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  |
 ------------ ------ -------- ------------ ------ --------  
 

Поэтому, когда вы сказали «показать A.Country » и A.Year «где A.Country находится Турция», вы можете увидеть, что все, что он может вернуть, — это Турция (из-за отдельной только 1 записи).

Но если вы сделаете B.Country это в Турции и покажете A.Country , вы получите Францию, Канаду и Турцию!

Комментарии:

1. Спасибо, б4 я не знал, почему а. и б. были там. теперь я это делаю 🙂

Ответ №2:

Изменить a.Country = 'Turkey' на b.Country = 'Turkey'

У тебя есть SELECT DISTINCT a.Country , но твое условие таково a.Country = 'Turkey' . Даже если вы получите несколько строк, они будут отфильтрованы по DISTINCT

Ответ №3:

 select distinct country,year from table1 where year=(select year from table  
where country='turkey') and country !=turkey;