【问题标题】:Stored procedure to get some rows and total获取一些行和总数的存储过程
【发布时间】:2013-12-31 00:11:52
【问题描述】:

我是 sql 新手,所以我需要你的帮助!我需要一个存储过程来获取一定数量的具有一定偏移量的文章和它们的总数来进行分页... 这是一个正确的代码还是有更好的方法?将执行多少查询,ctid 1 个,total 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 ;

【问题讨论】:

    标签: mysql stored-procedures mariadb


    【解决方案1】:

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

    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;
    

    【讨论】:

      【解决方案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演示

      【讨论】:

      • 感谢您提供如此详细的答案,但我不需要查询返回的行数。我需要一个内容表的数据,该数据具有返回行数和所有行数的限制。
      • 你不懂。 FOUND_ROWS()SQL_CALC_FOUND_ROWS 被包含时,返回 exactly 你所问的 - ALL 行的总数,好像 LIMIT 没有应用于查询,然后它更快发出另一个查询,甚至包含在子查询中。看看提供的工作示例。
      • 抱歉,没有读到最后……但我还是需要另外请求才能得到@total,我理解正确吗?
      • 没关系。它发生在我们最好的人身上:)。是的,这是正确的,您需要发出第二个选择来读取会话变量,但它比执行最有可能最终成为全扫描的完整查询要轻得多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      相关资源
      最近更新 更多