@square

Как найти два элемента с максимальным количеством общих связей?

Всем привет, на интервью попалась задачка, есть три таблицы: teacher(id, name), student (id, name) и teacher_student (teacher_id, student_id). Причем, без составного индекса на таблице связей, т.е. у любого учителя может быть любой набор учеников и наоборот.

Нужно вывести двух учителей имеющих максимальное кол-во общих студентов. Весь мозг поломал, со всеми задачами смог справится, а на этой вот случился затуп и никак. Подскажите в какую сторону копать? А-то мне уже кажется, что это невозможно)
  • Вопрос задан
  • 709 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `t1`.`name`, `t2`.`name`, COUNT(*) AS `count`
  FROM `teacher` AS `t1`
  JOIN (
    SELECT DISTINCT `teacher_id`, `student_id`
      FROM `teacher_student` 
  ) AS `s1` ON `s`.`teacher_id` = `t1`.`id`
  JOIN (
    SELECT DISTINCT `teacher_id`, `student_id`
      FROM `teacher_student` 
  ) AS `s2` ON `s2`.`student_id` = `s1`.`student_id` AND `s2`.`teacher_id` > `s1`.`teacher_id`
  JOIN `teacher` AS `t2` ON `t2`.`id` = `s2`.`teacher_id`
  GROUP BY `t1`.`id`, `t2`.`id`
  ORDER BY `count`
  LIMIT 1
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Cage
как то так
SELECT t.*, count( ts.teacher_id) as c
FROM teacher t
INNER JOIN teacher_student ts ON t.id= ts.teacher_id
GROUP BY t.id
ORDER BY c DESC
LIMIT 2
Ответ написан
@sAndreas
Юзер
Если я правильно понял весь прикол в
максимальное кол-во общих студентов
то:
select ts1.teacher_id,ts2.teacher_id, count(ts1.student_id) as cnt
from teacher_student ts1
left join teacher_student ts2
on ts1.teacher_id<>ts2.teacher_id and ts1.student_id=ts2.student_id
group by ts1.teacher_id,ts2.teacher_id
order by cnt
limit 2
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы