首页 > 解决方案 > 连接两个表时在mysql中查找重复值

问题描述

我有以下 3 个学生表,我需要找到当前就读于同时开会的班级的学生的姓名

student(**snum**, sname, major, level, age)
class(**cname**, meets_at, room) 
enroll(**snum**, **cname**)

每个表的键以粗体显示。

我已经尝试了以下代码,但我不确定我是否接近正确的答案。

select s.sname
  from student s
  join
     ( select c.cname
            , c.meets_at
            , (count(*)
         from class c
       having count( * ) > 1
     ) e
    on c.cname = e.cname
   and s.snum = e.snum;

标签: mysqlsql

解决方案


我会认为这是与学生一起加入meetsat。所以,这让学生知道他们的上课时间:

select s.sname, c.meets_at
from students s join
     enrolls e
     on s.snum = e.snum join
     classes c
     on c.cname = e.cname;

然后,要获取重复项,请使用聚合和过滤器having

select s.snum, s.sname, c.meets_at, count(*) as cnt
from students s join
     enrolls e
     on s.snum = e.snum join
     classes c
     on c.cname = e.cname
group by s.snum, sname, c.meets_at
having count(*) >= 2;

请注意,这包括 ID 和姓名,因为两个学生可能有相同的姓名。

最后,一个学生可能有多对冲突的班级,但您只想看到该学生一次。尽管上述内容可能足以满足您的目的,但针对所述问题的更准确的解决方案是:

select distinct s.sname
from students s join
     enrolls e
     on s.snum = e.snum join
     classes c
     on c.cname = e.cname
group by s.snum, sname, c.meets_at
having count(*) >= 2;

推荐阅读