#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;