Список всех сотрудников и количество людей, которыми они руководят, в mysql

У меня есть таблица сотрудников. У каждого сотрудника есть идентификатор сотрудника. У некоторых сотрудников есть поле супервайзера, которое ссылается на идентификатор другого сотрудника. В штате 10 сотрудников, двое из которых являются супервайзерами, каждый наблюдает за 4 людьми. Я пытаюсь получить список всех сотрудников и количество других сотрудников, которых они контролируют. Пока я могу только показать супервайзеров и номер, который они контролируют. Это мой запрос:

SELECT s.employee_name, COUNT(*)
FROM employee e
     join employee s on e.supervisor_id= s.employee_id
group by s.
order by s.employee_name;

Я попытался изменить JOIN на RIGHT JOIN, и теперь он покажет мне всех 10 сотрудников с двумя руководителями, показанными как имеющие 4 человека, которых они контролируют, но он показывает, что все остальные, которым некому руководить, имеют 1 вместо 0. Я уверен, что это что-то просто мне не хватает.

Образец данных:

employee_name, employee_name, supervisor_id,
'10111', 'Sydnee K. Stevens' NULL
'10870', 'Colton C. Rocha', '10111'
'11425', 'Astra V. Sharp','10111'
'12973', 'Melanie X. Rojas','10111'
'14451', 'Bethany Roman','10111'
'14597', 'Lydia Edwards', NULL
'16153', 'Selma Q. Conley', '14597'
'17730', 'Kristen B. Malone', '14597'
'17762', 'Barrett B. Bauer', '14597'
'18628', 'Shana Z. Flowers','14597'

person user2328273    schedule 01.02.2017    source источник
comment
Пример данных и ожидаемые результаты, пожалуйста. PS - у некоторых есть поле супервизора?   -  person user3741598    schedule 02.02.2017
comment
Должен быть Некоторые сотрудники имеют supervisor_id   -  person Paul Spiegel    schedule 02.02.2017
comment
все остальные, за которыми некому следить, имеют 1 вместо 0 - это из-за COUNT(*). Попробуйте COUNT(e.supervisor_id)   -  person Paul Spiegel    schedule 02.02.2017
comment
Ах, вот чего мне не хватало с этим. Спасибо.   -  person user2328273    schedule 02.02.2017


Ответы (2)


Использование LEFT или RIGHT JOIN COUNT(*) всегда будет как минимум 1. Если вы используете LEFT JOIN (RIGHT JOIN сбивает с толку), вам просто нужно подсчитать значения из правого столбца таблицы. COUNT(column) будет игнорировать все строки с NULL в этом столбце.

SELECT s.*, COUNT(e.supervisor_id) as num_supervised
FROM employee s
LEFT JOIN employee e on e.supervisor_id = s.employee_id
group by s.employee_id
order by s.employee_name;
person Paul Spiegel    schedule 01.02.2017
comment
Не могли бы вы немного объяснить, почему left или right с count(*) всегда хотя бы один? Просто чтобы лучше понимать, как это работает. - person user2328273; 02.02.2017
comment
@ user2328273 COUNT(*) будет подсчитывать все строки, в которых есть хотя бы один столбец со значением NOT NULL. В то время как COUNT(columnName) подсчитывает только строки со значениями NOT NULL в этом столбце. Посмотрите на пример здесь — нет строки, содержащей только NULL. - person Paul Spiegel; 02.02.2017
comment
@user2328273 Также взгляните на первый комментарий здесь - person Paul Spiegel; 02.02.2017

Мы присоединяемся к вашей таблице сотрудников с помощью выбора, как если бы мы присоединились к ней с реальной таблицей. Выбор будет состоять из всех supervisor_id и количества вхождений в поле supervisor_id (записи, в которых supervisor_id равен нулю, будут игнорироваться).

SELECT e.employee_id, e.employee_name, s.supervising 
FROM employee e
LEFT JOIN (SELECT supervisor_id, count(*) as supervising 
           FROM employee
           WHERE supervisor_id is NOT NULL
           GROUP BY supervisor_id) AS s
ON(e.employee_id = s.supervisor_id)
person iLikeMySql    schedule 01.02.2017
comment
Спасибо, это работает, как и ожидалось. Предложение Пола также сработало в рамках того, что у меня уже было. Получите больше, чем один способ думать о проблеме. - person user2328273; 02.02.2017