2013-05-22 10 views
8

このテーブルで自己結合を使用する必要があります。MySql。自己登録の使い方

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

トルコと同じ年の国を取得するには自己結合を使用する必要があります。 国名と年のみを表示します。

これは私がやろうとしていることです。

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

^googled自己参加して作成しました。

トルコのみです。私は間違って何をしていますか?

+2

+1を試してみてください。 '' a.country'を 'b.country'に変更します。 – xQbert

答えて

10

あなたはとても近いです!

Aから国と年を表示していて、トルコのA. Countryで制限していると言えば、トルコはあなただけのものです。選択をB.countryB.yearに変更するか、またはwhere句をB.countryに変更する必要があります。

これは、クロス結合を使用しているため、テーブル内のレコード数が増えます。

と書かれている可能性があり、同じ実行計画を持つ可能性があります。

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

OR これはINNERは、エンジンがしなければならない仕事を制限し、クロスだろうに参加することにパフォーマンスの低下に苦しむないJOINを使用しています。

あなたはA.Countryはトルコで、あなたはすべて見ることができるディスプレイA.CountryA.Yearを言ったときに参加だから AB

+------------+------+--------+------------+------+--------+ 
| 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 | 
+------------+------+--------+------------+------+--------+ 

を発生したときに、SQLエンジンがどうなるか考えてみましょう:WHY

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

それはトルコです(別の1レコードしかないため)

B.Countryはトルコ、A.Countryと表示されています。あなたはフランス、カナダ、トルコを手に入れます!

+1

ありがとう、b4私はなぜか分からなかった。およびb。があった。今私がやります :) – hank99

5

変更a.Country = 'Turkey'

b.Country = 'Turkey'にあなたは SELECT DISTINCT a.Countryを持っていますが、あなたの状態は a.Country = 'Turkey'です。たとえ複数の行を取得しても、それらはフィルタリングされます。 DISTINCT

+0

ありがとう非常にありがとう – hank99

+0

この[質問](http://dba.stackexchange.com/q/101947/66799) – Rembo

0
select distinct country,year from table1 where year=(select year from table 
where country='turkey') and country !=turkey; 
関連する問題