Написание запросов без предела - PullRequest
1 голос
/ 20 февраля 2020

Как я могу переписать приведенный ниже запрос без предложения Limit?

SELECT project.title, 
       COUNT(project2manager.managerid) AS Cnt_Manager
FROM project2manager 
JOIN project ON project2manager.projectid = project.projectid 
GROUP BY project.title
ORDER BY Count_Manager DESC LIMIT 1;

+-----------------+-------------+
| project.title   | Cnt_Manager |
+-----------------+-------------+
| City Scape      |           8 |
+-----------------+-------------+

Я пытался использовать предложение MAX, но продолжаю получать неверное название проекта, но правильное количество менеджеров. что было бы лучшим способом исправить это?

SELECT title , MAX(Total) 
FROM (SELECT project.title, COUNT(project2manager.managerid) AS Total
FROM project2manager 
JOIN project ON project2manager.projectid = project.projectid 
GROUP BY project.title) AS Result;
+-------------------------+------------+
| project.title           | MAX(Total) |
+-------------------------+------------+
| Comic Con               |         8  |
+-------------------------+------------+

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Если вы используете MySQL 8.0, вы можете обрабатывать верхние связи с rank():

select title, cnt_manager
from (
    select 
        p.title, 
        count(*) as cnt_manager,
        rank() over(order by count(*) desc) rn
    from project2manager pm
    join project p on pm.projectid = p.projectid 
    group by p.projectid, p.title
) t
where rn = 1

Обратите внимание, что я изменил ваш запрос следующим образом:

  • если только не существует вероятность того, что некоторые записи в project2manager имеют managerid, то есть null, count(project2manager.managerid) может быть сокращено до просто count(*)

  • псевдонимов таблицы упростить написание и чтение запроса

  • кажется, что вы хотите сгруппировать данные по проекту; если это так, то вам не следует заниматься исключительно проектом title - что если два разных проекта имеют одинаковое название? Чтобы избежать этого, я добавил projectid в предложение group by

0 голосов
/ 20 февраля 2020

Попробуйте прямое решение:

SELECT project.title, 
       COUNT(project2manager.managerid) AS Cnt_Manager
FROM project2manager 
JOIN project ON project2manager.projectid = project.projectid 
GROUP BY project.title
HAVING NOT EXISTS ( SELECT NULL
                    FROM project2manager p2m
                    JOIN project p ON p2m.projectid = p.projectid 
                    GROUP BY p.title
                    HAVING COUNT(p2m.managerid) >= Cnt_Manager )

Для версии 8+ сделайте то же самое, используя CTE.

...