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