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

时间:2013-12-12 14:17:55

标签: 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 ;

2 个答案:

答案 0 :(得分:2)

您可以尝试利用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 ;

样本用法:

SET @total = 0;
CALL get_articles(0, 3, @total);
SELECT @total;

这是 SQLFiddle 演示

答案 1 :(得分:0)

我想你看起来像这样的查询。如果不太复杂,请尝试在同一查询中执行所有操作。

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;