2017-02-01 1 views
0

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

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' 
+0

Примеры данных и ожидаемых результатов, пожалуйста. PS - «некоторые» имеют поле супервизора? – user3741598

+0

Должно быть: «У некоторых сотрудников есть супервизор» –

+1

«все остальные, которым нечего контролировать 1, а не 0» - это из-за 'COUNT (*)'. Попробуйте 'COUNT (e.supervisor_id)' –

ответ

0

Использование LEFT или RIGHT JOINCOUNT(*) всегда будет по крайней мере 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; 
+0

Не могли бы вы объяснить, почему 'left' или' right' с 'count (*)' всегда по крайней мере один? Просто я лучше понимаю, как это работает. – user2328273

+0

@ user2328273 'COUNT (*)' будет считать все строки, имеющие хотя бы один столбец с значением NOT NULL. В то время как 'COUNT (columnName)' только подсчитывает строки с NOT NULL значениями в этом столбце. Посмотрите на пример [здесь] (http://rextester.com/JYPH60307) - Нет строки, содержащей только NULL. –

+0

@ user2328273 Также посмотрите первый комментарий [здесь] (https://dev.mysql.com/doc/refman/5.7/en/counting-rows.html) –

0

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

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) 
+0

Спасибо, что работает как ожидалось. Предложение Павла также работало в том, что я уже имел. Получите больше, чтобы один из способов думать о проблеме. – user2328273