Каким будет мой запрос sql

Rakesh Kohali спросил: 28 апреля 2018 в 09:20 в: mysql

У меня есть две таблицы в моей базе данных.

 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 ответов

Есть решение
MatBailie ответил: 28 апреля 2018 в 09:38

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

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
                                )
             )
Tim Biegeleisen ответил: 28 апреля 2018 в 09:31

Это настоящая боль для обработки в 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;
Muhammad Noman ответил: 28 апреля 2018 в 09:46

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

Использование вспомогательного запроса

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)

Использование Join б>

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)

Raymond Nijland ответил: 28 апреля 2018 в 09:38
Маленький намек: вы также отформатируете и форматируете код приложения, а также с кодом SQL, что делает его большим eazier для записи и чтения длинной отдельной строки.
Muhammad Noman ответил: 28 апреля 2018 в 09:47
@RaymondNijland Спасибо. Готово!
abdifatah supparka ответил: 28 апреля 2018 в 10:16

сначала проверьте, что столбец, связанный с двумя типами, имеет одно и то же имя, тот же тип данных и вспомогательный запрос использования, SELECT name FROM department WHERE id IN (SELECT department_id FROM employees HAVING COUNT (department_id) IN (SELECT MAX (COUNT (dept_id)) FROM сотрудников) GROUP BY department_id)

)

Henderz ответил: 28 апреля 2018 в 09:50

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

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

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)
juergen d ответил: 28 апреля 2018 в 09:24
Это MySQL, а не SQL Server
Tim Biegeleisen ответил: 28 апреля 2018 в 09:28
Это вопрос MySQL, а не SQL Server (повторить вышеприведенный комментарий).
Henderz ответил: 28 апреля 2018 в 09:32
Извините, но какая часть запроса не поддерживается MySQL? И я интерпретировал этот вопрос как "мой запрос для SQL", а не запрос MySQL.
MatBailie ответил: 28 апреля 2018 в 09:32
TOP 1 vs LIMIT 1?