2016-07-05 149 views
0

我有一个Students表和一个语言表。它们使用数据透视表Languages_Student形成多对多的关系。Count()对多对多关系

有没有办法让学生的语言与其他学生有最多的共同点?

我不太清楚如何将COUNT()与某种选择结合起来。这是我与现在的工作是什么:

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 

我试图获得与ID为65

任何想法的学生的常用语言最大金额的学生吗?

回答

0

您可以使用自连接来完成此操作。在语言列中加入交叉表本身;然后聚集在学生列,以获得数共同点:

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

是的!谢谢! –

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)