Каким будет мой sql запрос - PullRequest
0 голосов
/ 22 мая 2018

В моей базе данных есть 2 таблицы.

 Table 1. employee
id
name
department_id



 Table 2. department
id
name

Теперь у меня есть 2 вопроса.

1. Каким будет запрос на выборку всех сотрудников из их отдела?поэтому я написал этот запрос

SELECT employee.name
     , department.name 
  FROM employee 
  JOIN department 
    ON employee.department_id = department.id

И, похоже, это правильно, но я не могу написать запрос для следующего вопроса.

Вопрос:

, еслия хочу выбрать только тот отдел, в котором работает наибольшее количество сотрудников?

Ответы [ 5 ]

0 голосов
/ 22 мая 2018

сначала проверьте, что столбцы, относящиеся к двум типам, имеют одно и то же имя, один и тот же тип данных и подзапрос использования, имя SELECT ОТ ОТДЕЛА, ГДЕ ИДЕНТИФИКАЦИЯ (ВЫБРАТЬ ОТДЕЛ ОТДЕЛЕНИЯ ОТ СЧЕТА (отдел_идентификатор) IN (ВЫБРАТЬ МАКС (СЧЕТ (dept_id))ОТ сотрудников) GROUP BY департамент_id)

)

0 голосов
/ 22 мая 2018

Чтобы гарантировать только один отдел ...

SELECT
  *
FROM
  department
WHERE
  id = (SELECT department_id
          FROM employee
      GROUP BY department_id
      ORDER BY COUNT(*) DESC
         LIMIT 1
       )

Обратите внимание, что если два отдела связаны с максимальным количеством сотрудников, в этом случае будет выбран только одиниз них (произвольно выбранные, потенциально каждый раз разные).

Для обработки связей вы можете сделать следующее ...

SELECT *
  FROM department
 WHERE id IN (SELECT department_id
                FROM employee
            GROUP BY department_id
              HAVING COUNT(*) = (SELECT COUNT(*)
                                   FROM employee
                               GROUP BY department_id
                               ORDER BY COUNT(*) DESC
                                  LIMIT 1
                                )
             )
0 голосов
/ 22 мая 2018

Это настоящая боль в MySQL.Вот один из вариантов:

SELECT d1.id, d1.name
FROM department d1
INNER JOIN employee e1
    ON d1.id = e1.department_id
GROUP BY d1.id, d1.name
HAVING COUNT(*) = (SELECT COUNT(*) FROM department d2 INNER JOIN employee e2
                       ON d2.id = e2.department_id
                   GROUP BY d2.id ORDER BY COUNT(*) DESC LIMIT 1);

Обратите внимание, что если вы использовали базу данных с поддержкой аналитических функций, например SQL Server, то проблема становится намного проще:

SELECT id, name
FROM
(
    SELECT d.id, d.name, DENSE_RANK() OVER (ORDER BY COUNT(*) DESC) dr
    FROM department d
    INNER JOIN employee e
        ON d.id = e.department_id
    GROUP BY d.id, d.name
) t
WHERE t.dr = 1;
0 голосов
/ 22 мая 2018

Этот вопрос может быть решен несколькими способами:

Использование подзапроса

SELECT name FROM department
WHERE id IN
(SELECT department_id FROM employee HAVING COUNT(department_id)
IN
(SELECT MAX(COUNT(department_id)) FROM employee) GROUP BY department_id)

Использование объединения

SELECT name FROM employee e
INNER JOIN
department d ON e.department_id = d.id
HAVING COUNT(e.department_id)
IN
(SELECT MAX(COUNT(department_id)) from employee) group by department_id)
0 голосов
/ 22 мая 2018

Ваш запрос должен работать для первого вопроса.

для второго. Вы можете использовать это.Подзапрос даст вам идентификатор отдела для большинства сотрудников, для которого внешний запрос предоставит дополнительную информацию.

select * from department where department_id in
(select limit 1 Employee.department_id from Employee group by department_id 
order by count(Employee.name) desc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...