Mysql 如何在分组之前限制记录以进行分页?

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

我有一个查询,它将留下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.id)
WHERE r.comment_id = c.id
GROUP BY c.id
DB Fiddle链接:

查询可以工作,但是如果注释记录很大(例如10K),我需要实现分页,如何修改此查询以在分组之前首先限制注释记录

简言之:

  • 将前5条评论限制为5条
  • 左键加入表格
  • 按组计算总数
  • 例如,显示前4条注释的总和

    谢谢

    请尝试以下操作:

    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使用的算法