编写没有 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
中的某些记录有可能 managerid
即 null
,count(project2manager.managerid)
可以缩短为 count(*)
table 别名使查询更易于编写和阅读
看来你想按项目对数据进行分组;如果是这样,您不应该只依赖项目 title
- 如果两个不同的项目具有相同的标题怎么办?为避免这种情况,我将 projectid
添加到 group by
子句
如何在没有 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
中的某些记录有可能managerid
即null
,count(project2manager.managerid)
可以缩短为count(*)
table 别名使查询更易于编写和阅读
看来你想按项目对数据进行分组;如果是这样,您不应该只依赖项目
title
- 如果两个不同的项目具有相同的标题怎么办?为避免这种情况,我将projectid
添加到group by
子句