#mysql #sql #count #left-join #aggregate-functions
#mysql #sql #граф #левое соединение #агрегатные функции
Вопрос:
Мне нужно количество врачей, ординаторов, медсестер и пациентов в каждом отделении. Однако это не дает никаких результатов. Если я удалю 3 типа, это даст мне список подсчетов оставшихся типов людей. Как сделать так, чтобы результаты отображались при включении всех типов пользователей?
Спасибо.
`SELECT DISTINCT
department.departmentID,
COUNT(doctor.doctorID) AS number_of_doctors,
COUNT(resident.residentID) AS number_of_residents,
COUNT(nurse.nurseID) AS number_of_nurses,
COUNT(patient.patientID) AS patient_count
FROM department
INNER JOIN person ON department.departmentID = person.departmentID
INNER JOIN doctor ON doctor.employeeID = person.personID
INNER JOIN resident ON resident.employeeID = person.personID
INNER JOIN nurse ON nurse.employeeID = person.personID
INNER JOIN patient ON patient.patientID = person.personID
GROUP BY department.departmentID'
Комментарии:
1. Поскольку вы используете внутреннее объединение медсестры, врача, ординатора и пациента, вы, по сути, запрашиваете людей, которые являются всеми четырьмя. Вам лучше сделать подвыборку для каждой категории.
2. Рассмотрите возможность решения проблем отображения данных в коде приложения
Ответ №1:
Предположительно, у вас не может быть человека, который одновременно является врачом, ординатором, медсестрой и пациентом. Так что используйте left join
s :
SELECT
de.departmentID,
COUNT(do.doctorID ) AS number_of_doctors,
COUNT(re.residentID) AS number_of_residents,
COUNT(nu.nurseID ) AS number_of_nurses,
COUNT(pa.patientID ) AS patient_count
FROM department de
INNER JOIN person pe ON de.departmentID = pe.departmentID
LEFT JOIN doctor do ON do.employeeID = pe.personID
LEFT JOIN resident re ON re.employeeID = pe.personID
LEFT JOIN nurse nu ON nu.employeeID = pe.personID
LEFT JOIN patient pa ON pa.patientID = pe.personID
GROUP BY de.departmentID