2013-05-22 4 views
8

Ich brauche Self Join in dieser Tabelle verwenden.MySql. Wie Verwenden von Self Join

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

Ich brauche Self-Join, um zu bekommen, welche Länder das gleiche Jahr wie die Türkei hat. Nur Land und Jahr anzeigen.

Dies ist, was ich versuche zu tun.

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

^googled selbst kommen, und haben es geschafft.

Ich bekomme nur die Türkei. Was mache ich falsch?

+2

+1 zum Ausprobieren und googeln. 'jsut ändern' a.country 'zu' b.country'. – xQbert

Antwort

10

gefiltert. Sie sind so nah dran!

Da Sie sagen, dass Sie das Land und Jahr von A anzeigen und durch A. Country der Türkei begrenzen, ist die Türkei alles, was Sie sehen werden. Sie müssen entweder die Auswahlen auf B.country und B.year ändern oder die Where-Klausel auf B.country ändern.

Dies verwendet einen Cross-Join, der umso langsamer wird, je mehr Datensätze in einer Tabelle vorhanden sind.

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

könnte geschrieben werden als ... und hätte wahrscheinlich den gleichen Ausführungsplan.

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 Diese verwendet ein INNER JOIN, die die Arbeit beschränkt sich der Motor tun müssen und leidet nicht unter Leistungseinbußen, die ein Kreuz verbinden würde.

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

WARUM:

Überlegen Sie, was die SQL-Engine tun wird, wenn die Verbindung tritt 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 | 
+------------+------+--------+------------+------+--------+ 

Also, wenn Sie die Anzeige A.Country und A.Year wo A.Country Türkei ist, können Sie alle sehen es kann zurückgegeben werden ist die Türkei (aufgrund der eindeutigen nur 1 Datensatz)

Aber wenn Sie tun B.Country ist Türkei und Display A.Country, erhalten Sie Frankreich, Kanada und die Türkei!

+1

Danke, b4 Ich wusste nicht, warum a. und B. war dort. Jetzt mache ich :) – hank99

5

ändern a.Country = 'Turkey'-b.Country = 'Turkey'

Sie haben SELECT DISTINCT a.Country, aber Ihr Zustand ist a.Country = 'Turkey'. Selbst wenn Sie mehrere Zeilen erhalten, werden sie durch die DISTINCT

+0

Vielen Dank – hank99

+0

diese Frage beantworten (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;