没有限制子句的查询查询

时间:2020-02-20 17:31:52

标签: mysql sql group-by sql-order-by greatest-n-per-group

如何在没有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 :(得分:0)

尝试直接解决方案:

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

答案 1 :(得分:0)

如果您正在运行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的{​​{1}},否则null可以缩短为count(project2manager.managerid)

  • 表别名使查询更易于编写和读取

  • 您似乎想按项目对数据进行分组;如果是这样,那么您不应该只关注项目count(*) -如果两个不同的项目具有相同的标题怎么办?为了避免这种情况,我在title子句中添加了projectid