编写没有 limit 子句的查询

Writing Queries without the limit clause

如何在没有 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  |
+-------------------------+------------+

尝试直接解决方案:

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 执行相同的操作。

如果您是 运行 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 中的某些记录有可能 manageridnullcount(project2manager.managerid) 可以缩短为 count(*)

  • table 别名使查询更易于编写和阅读

  • 看来你想按项目对数据进行分组;如果是这样,您不应该只依赖项目 title - 如果两个不同的项目具有相同的标题怎么办?为避免这种情况,我将 projectid 添加到 group by 子句