2016-07-05 12 views
0

Ich habe eine Studententabelle und eine Sprachtabelle. Sie bilden eine Viele-zu-Viele-Beziehung unter Verwendung einer Pivot-Tabelle Languages_Student.Count() auf viele zu viele Beziehung

Gibt es eine Möglichkeit, den Schüler mit der größten Anzahl an Sprachen mit einem anderen Schüler zu verbinden?

Ich bin nicht ganz sicher, wie man COUNT() mit einer Art von Auswahl kombinieren. Dies ist, was ich bin mit jetzt:

select * from students student1 
inner join languages_student ls1 
    on student1.id = ls1.student_id 
inner join languages l1 
    on l1.id = ls1.language_id 
inner join languages_student ls2 
    on l1.id = ls2.language_id 
inner join students student2 
    on ls2.student_id = student2.id 
where student1.id = 65 
group by 16 

Ich versuche, die Schüler mit größten Menge an Sprachen gemeinsam mit dem Schüler mit der ID 65.

Irgendwelche Ideen zu bekommen?

Antwort

0

Sie können dies mit einem Self-Join tun. Verbinden Sie die Junction-Tabelle mit sich selbst auf der Sprache Spalte; dann Aggregat durch die Spalte Student die Anzahl gemeinsam zu bekommen:

select ls.student_id, count(*) as NumInCommon 
from languages_student ls join 
    languages_student ls65 
    on ls.language = ls65.language and ls65.student_id = 65 and 
     ls65.student_id <> ls.student_id 
group by ls.student_id 
order by count(*) desc; 
+0

Ja! Vielen Dank! –

0
 select ls.student_id, count(ls.language_id) as common 
     from languages_student ls 
     where ls.id in (  
       select l.id 
       from students s 
       inner join languages_student ls 
       on s.id = ls.student_id 
       inner join languages l 
       on l.id = ls.language_id 
       where s.id = 65) 
     order by count(ls.language_id)