Начните с INTERVIEW_TYPES, сохраните выбранные типы через LEFT JOIN и посчитайте существующих интервьюеров. Это покажет ноль для типа без доступных специалистов.
Подсчёт количества доступных интервьюеров по типам интервью
Начните с INTERVIEW_TYPES, сохраните выбранные типы через LEFT JOIN и посчитайте существующих интервьюеров. Это покажет ноль для типа без доступных специалистов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Имеется база данных, состоящая из трёх таблиц. Необходимо вывести список интервью и число интервьюеров, которые могут их проводить, учитывая только типы интервью "Java", "JavaScript", "Frontend".
create table INTERVIEW_TYPES
(
id int auto_increment primary key,
name varchar(255) not null,
constraint INTERVIEW_TYPES_name_uindex unique (name)
);
create table INTERVIEWERS
(
id int auto_increment primary key,
name varchar(255) not null,
constraint INTERVIEWERS_name_uindex unique (name)
);
create table INTERVIEWERS_INTERVIEW_TYPES
(
interview_id int not null,
interviewer_id int not null,
constraint INTERVIEWERS_INTERVIEW_TYPES_interview_id_interviewer_id_uindex unique (interview_id, interviewer_id)
);
Ответ
Начните с INTERVIEW_TYPES, сохраните выбранные типы через LEFT JOIN и посчитайте существующих интервьюеров. Это покажет ноль для типа без доступных специалистов.
SELECT t.name, COUNT(i.id) AS interviewers_count
FROM INTERVIEW_TYPES t
LEFT JOIN INTERVIEWERS_INTERVIEW_TYPES link ON link.interview_id = t.id
LEFT JOIN INTERVIEWERS i ON i.id = link.interviewer_id
WHERE t.name IN ('Java', 'JavaScript', 'Frontend')
GROUP BY t.id, t.name;
Уникальная пара в таблице связи предотвращает повторный подсчёт одного интервьюера для типа. COUNT(i.id), а не COUNT(*), исключает пустые строки внешнего соединения и отсутствующих интервьюеров. Тип, которого вообще нет в INTERVIEW_TYPES, такой запрос не создаёт искусственно.