Пытаюсь использовать join, count и group by, но не работает так, как я хочу

#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 !! Это работает именно так, как я хочу 🙂