Мне нужна помощь с запросом MySQL - PullRequest
3 голосов
/ 19 мая 2011
I have two tables - `employee` and `department`. 

1. `employee` table contains column id,employee name and dept_id
2. `department` table contains column id, department name.

I need exact department name which contains 

1. maximum employee and 
2. no employee

Отредактировано:

Apologizing for bad grammar, here is the example for above two questions what i need.
1. for eg: if two department contains same number of employees, i need to show both department not single by limit.
2. for eg: if more than one department contains 0 employees, i must show those departments particularly.

Ответы [ 5 ]

4 голосов
/ 19 мая 2011
select department_name as `department name`, 
       count(*) as `number of employees`
from employee 
        inner join department 
            on employee.dept_id = department.id
group by department_name
order by count(*) desc
limit 1

я думаю, что должен это сделать.Я ничего не делал с MySQL в течение некоторого времени.

edit: пропустил второй вопрос

select department_name as `department name`, 
       count(*) as `number of employees`
from employee 
        left join department 
            on employee.dept_id = department.id
group by department_name
  HAVING count(*) = 0
2 голосов
/ 19 мая 2011

Ответ на первый вопрос:

WITH epcount(dept_id, ep_count) AS
(
    SELECT dept_id, COUNT(*) AS ep_count
        FROM employee
        GROUP BY dept_id
)
SELECT d.name FROM epcount AS ec1 JOIN department AS d ON ec1.dept_id=d.id
    WHERE NOT EXISTS
        (SELECT * FROM epcount AS ec2 WHERE ec1.ep_count < ec2.ep_count)

Ответ на второй вопрос:

SELECT name FROM department AS d
    WHERE NOT EXISTS
        (SELECT * FROM  employee AS e WHERE d.id=e.dept_id)
1 голос
/ 19 мая 2011

Если я правильно прочитал вопрос, вам нужно:

select department_name,
       count(employee.dept_id) as num_employees
from department
left join employee on employee.dept_id = department.id
group by department_name
having count(employee.dept_id) = 0 or
       count(employee.dept_id) = (select count(dept_id)
                   from employee
                   group by employee.id
                   order by count(dept_id) desc
                   limit 1)
1 голос
/ 19 мая 2011

Это даст вам отсортированный список отделов, отсортированный по количеству сотрудников.

SELECT `dept`.`id`, `dept`.`name`, COUNT(`employee`.`id`) as `employee_count`
    FROM `dept` LEFT JOIN `employee`
        ON `employee`.`dept_id` = `dept`.`id`
    GROUP BY `dept`.`id`
    ORDER BY `employee_count`

Чтобы получить отделы без сотрудников, добавьте:

AND `employee_count` = 0

... передGROUP BY.

Чтобы получить отдел с наибольшим количеством сотрудников, добавьте DESC LIMIT 1 в конец.

0 голосов
/ 19 мая 2011

Запрос, который показывает названия отделов с максимальным количеством сотрудников и количеством сотрудников в нем:

SELECT department.name, COUNT(employee.name) from department
 INNER JOIN employee
 ON employee.dept_id = department.id
 GROUP BY department.name
 ORDER BY COUNT(employee.name) DESC limit 1

Запрос, который показывает отделы без сотрудников:

SELECT department.name from department
 LEFT JOIN employee
 ON employee.dept_id = department.id
 HAVING COUNT(employee.name) = 0
 GROUP BY department.name

Если вам нужно показать егов одном запросе вставьте первый запрос, добавьте UNION ALL, а затем вставьте второй запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...