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

Mysql 获取一些行和总计的存储过程,mysql,stored-procedures,mariadb,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 conte

我是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 ;

我猜你是在问这样的问题。如果查询不太复杂,请尝试在同一个查询中执行所有操作

SELECT c.*, 
      (SELECT COUNT(*) FROM content AS c1 WHERE c1.content_type = ct.id) AS total  
  FROM content AS c 
  INNER JOIN content_type AS ct ON c.content_type = ct.id
WHERE ct.name = 'article'
  LIMIT offset, count;

您可以尝试利用
SQL\u CALC\u FOUND\u ROWS
选项和函数

SQL\u CALC\u FOUND\u ROWS和FOUND\u ROWS()在以下情况下非常有用: 您想要限制查询返回的行数,但是 确定完整结果集中的行数,而不运行 再次查询。例如,一个Web脚本显示分页 包含指向页面链接的显示,这些页面显示 搜索结果。使用find_ROWS()可以确定有多少行 其余结果需要其他页面

也就是说你的手术看起来像

分隔符$$
创建过程获取项目(输入偏移量INT、输入计数INT、输出总INT)
开始
选择SQL\u CALC\u FOUND\u ROWS*
从内容c连接内容类型t
关于c.content\u type=t.id
其中t.name='article'
限制_偏移量_计数;
SET _total=找到的_行();
结束$$
定界符;
示例用法:

SET@total=0;
调用获取文章(0,3,@total);
选择@total;

下面是一个演示

thx以获得如此详细的答案,但我不需要查询返回多少行。我需要一个有返回行数和所有行总数限制的内容表数据。你不明白
FOUND_ROWS()
包含
SQL\u CALC\u FOUND_ROWS
时,会准确返回您要求的内容-所有行的总数,就好像
LIMIT
未应用于查询一样,它比发出另一个甚至包含在子查询中的查询更快。请看提供的工作示例。抱歉,直到最后才阅读。。。但是我还需要另外一个请求才能得到@total,我理解对了吗?没关系。这发生在我们当中最好的人身上:)。是的,这是正确的,您需要发出第二个select来读取会话变量,但是它比执行完整的查询要轻得多,而执行完整的查询很可能最终是一个完整的扫描。