#mysql #join #group-by #count
Вопрос:
Я запрашиваю свою базу данных, которая является каталогом компании. В справочнике компании есть три отдельные таблицы: Сотрудники, Отделы и Местоположения.
Ниже приведено изображение того, как выглядит моя структура таблицы:
Я пытаюсь запросить базу данных, чтобы получить столбцы идентификатора отдела, названия отдела, идентификатора местоположения, имени местоположения, а также количество сотрудников в этом отделе. Однако мне также нужно, чтобы в нем был указан отдел, даже если в нем пока нет сотрудников, назначенных на эту должность.
Я не уверен, какой тип соединения использовать, но я знаю, что должен использовать функцию count и groupBy.
Я все еще очень новичок в SQL и пока не очень хорошо разбираюсь в нем. Я попробовал один или два подхода, но безрезультатно.
Вот моя попытка, которая действительно приносит результаты, как я и хотел, но она исключает отделы, в которых нет сотрудников.
SELECT p.id, p.lastName, p.firstName, p.jobTitle, p.email, d.id,
d.name as department, l.name as location, COUNT(*) as totalStaff
FROM personnel p
LEFT JOIN department d ON (d.id = p.departmentID)
LEFT JOIN location l ON (l.id = d.locationID)
GROUP BY (d.id)
Кто-нибудь может помочь?
Комментарии:
1. Уверен, что вы спросили об этом несколько часов назад. По крайней мере, ваш последний вопрос содержал попытку запроса
2. Всегда приятно с вопросом sql предоставить схему и некоторые тестовые данные в виде текста, способного копировать/вставлять. Картинки действительно бесполезны Или как SQLFiddle.
3. Меня вызвали, когда я увидел предыдущий вопрос, я, кажется, помню, что думал, что вам нужно использовать
FROM department LEFT JOIN the other 2 tables
, тогда вы всегда будете получать данные отдела4. Привет, Риггс! Да, извини за это. Я подумал, что мне нужно объясниться еще раз, но лучше. Мне пришлось еще немного уточнить свое объяснение. Я обновил свою первоначальную попытку запроса, если это снова поможет.
Ответ №1:
Начиная с отдела и заканчивая присоединением к другим 2 таблицам, вы всегда будете получать всю информацию о отделе, которая, как я помню, была вашей первоначальной проблемой в предыдущем вопросе
SELECT p.id, p.lastName, p.firstName, p.jobTitle, p.email,
d.id, d.name as department,
l.name as location,
COUNT(p.id) as totalStaff
FROM department d
LEFT JOIN personnel p ON (d.id = p.departmentID)
LEFT JOIN location l ON (l.id = d.locationID)
GROUP BY (d.id)
Комментарии:
1.
COUNT(*)
должно бытьCOUNT(p.id)
так, чтобы вы не учитывалиNULL
ценность для отделов, в которых нет персонала.2. Спасибо тебе @Barmar
3. Огромное спасибо вам @RiggsFolly !! Это работает именно так, как я хочу 🙂