Mysql 如何在分组之前限制记录以进行分页?
我有一个查询,它将留下JOIN和GROUP BY来获取列的和Mysql 如何在分组之前限制记录以进行分页?,mysql,Mysql,我有一个查询,它将留下JOIN和GROUP BY来获取列的和 SELECT c.id, SUM( r.score ) AS score_sum, SUM( CASE WHEN r.is_active = '0' THEN r.negative ELSE 0 END ) AS negative_sum FROM comments AS c LEFT JOIN rates AS r ON (r.comment_id = c
SELECT
c.id,
SUM(
r.score
) AS score_sum,
SUM(
CASE WHEN r.is_active = '0' THEN r.negative ELSE 0 END
) AS negative_sum
FROM comments AS c
LEFT JOIN rates AS r ON (r.comment_id = c.id)
WHERE r.comment_id = c.id
GROUP BY c.id
DB Fiddle链接:
查询可以工作,但是如果注释记录很大(例如10K),我需要实现分页,如何修改此查询以在分组之前首先限制注释记录
简言之:
SELECT
c.id,
SUM(
r.score
) AS score_sum,
SUM(
CASE WHEN r.is_active = '0' THEN r.negative ELSE 0 END
) AS negative_sum
FROM comments AS c
LEFT JOIN rates AS r ON (r.comment_id = c.id)
WHERE r.comment_id = c.id
GROUP BY c.id
ORDER BY c.id ASC
LIMIT 5
上述查询的基本原理是id
是comments
表中的主键(因此被索引)。此外,您的分组依据
和订单依据
位于同一列,即id
;因此,MySQL将首先利用id
上的索引,获得前5行(由于限制
),然后继续与其他表进行连接
,并进行聚合等
试试看更多详细信息,请点击此处:
我们可以在这个查询中使用EXPLAIN..
来确认这一点 您可以使用子查询在from子句中“从注释限制N中选择c.id”
select c.id,
sum(r.score) as score_sum,
SUM(
CASE WHEN r.is_active = '0' THEN r.negative ELSE 0 END
) AS negative_sum
from ( select c.id from comments c limit 2) c
LEFT JOIN rates AS r ON (r.comment_id = c.id)
GROUP BY c.id;
您可以在子查询中应用order by来确定选择注释的顺序(前N)
Hi如果表不是使用主键而是其他列连接的,这仍然有效吗?Thanks@cyberfly当我们从第一个表连接到第二个表时;第一个表上的键并不重要,但第二个表上定义的索引很重要。如果您想深入研究,请阅读MySQL使用的算法