Поиск дублирующих значений в mysql при соединении двух таблиц - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть следующие 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;

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018
select s.snum, s.sname, c.meets_at ,count(*) as cnt into #tempStudents 
from students s 
join enrolls e on s.snum = e.snum 
join classes c on c.cname = e.cname;

Поместить все данные во временную таблицу

select sname from #tempStudents 
group by snum,sname ,meets_at  
having cnt >=2

Теперь примените фильтрацию к временной таблице для получения желаемых данных. и если вам нужно другое имя студента, поставьте Distinct ключевое слово перед sname .

0 голосов
/ 12 ноября 2018

Я бы подумал об этом как о присоединении к студентам с 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;

Обратите внимание, что это включает в себя идентификаторы, а также имя, потому что два студента могут иметь одинаковое имя.

Наконец, у ученика может быть несколько пар классов, которые конфликтуют, но вы хотите увидеть ученика только один раз. Хотя вышеприведенного, вероятно, достаточно для ваших целей, более точное решение указанной проблемы будет следующим:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...