用于获取一些行和总计的存储过程

Kir*_*ill 1 mysql stored-procedures mariadb

我是sql新手,所以我需要你的帮助!我需要一个存储过程来获取一定数量的带有一定偏移量的文章和它们的总数来进行分页...这是正确的代码还是有更好的方法?将执行多少查询,1 个用于 ctid,1 个用于总计,1 个用于内容数据?

DELIMITER $$
CREATE PROCEDURE `getArticles`(`offset` INT, `count` INT)
BEGIN
  DECLARE ctid, total INT;
  SET ctid = (SELECT id FROM content_types WHERE name='article');
  SET total = (SELECT COUNT(*) FROM content WHERE content_type = ctid);  
  SELECT *, total FROM content 
    WHERE content_type = ctid 
    LIMIT count 
    OFFSET offset;
END $$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

pet*_*erm 5

您可以尝试利用SQL_CALC_FOUND_ROWS选项和FOUND_ROWS()功能

当您想要限制查询返回的行数,但又想确定完整结果集中的行数而不再次运行查询时,SQL_CALC_FOUND_ROWS 和 FOUND_ROWS() 非常有用。一个示例是 Web 脚本,它呈现分页显示,其中包含指向显示搜索结果其他部分的页面的链接。使用 FOUND_ROWS() 使您能够确定结果的其余部分需要多少其他页面。

话虽这么说,你的程序可能看起来像

DELIMITER $$
CREATE PROCEDURE get_articles(IN _offset INT, IN _count INT, OUT _total INT)
BEGIN
  SELECT SQL_CALC_FOUND_ROWS * 
    FROM content c JOIN content_types t 
      ON c.content_type = t.id
   WHERE t.name = 'article' 
    LIMIT _offset, _count;
  SET _total = FOUND_ROWS();
END$$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

使用示例:

SET @total = 0;
CALL get_articles(0, 3, @total);
SELECT @total;
Run Code Online (Sandbox Code Playgroud)

这是SQLFiddle演示