【问题标题】:SQL Count total number of rows whilst using LIMITSQL Count 使用 LIMIT 时的总行数
【发布时间】:2010-11-10 16:33:54
【问题描述】:

我正在尝试创建一个简单的图片库,每页显示 16 张图片。我使用 LIMIT 16 在页面上显示正确的数量,但如果超过 16 行,我希望在底部有链接,允许用户导航到下一页。

我知道我可以通过删除限制并简单地使用循环来显示前 16 个项目来实现所需的结果,但这将是低效的。显然,COUNTING 行数总是 = 16。

$sql .= "posts p, images im, postimages pi WHERE
    i.active = 1 
    AND pi.post_id = p.id
    AND pi.image_id = im.image_id 
    ORDER BY created_at LIMIT 16";

任何人都可以提出一种更有效的方法吗?

谢谢

【问题讨论】:

    标签: sql count limit


    【解决方案1】:

    在MySQL:

    SELECT  SQL_CALC_FOUND_ROWS
            *
    FROM    posts p, images im, postimages pi
    WHERE   i.active = 1 
            AND pi.post_id = p.id
            AND pi.image_id = im.image_id 
    ORDER BY
            created_at
    LIMIT 16;
    
    SELECT  FOUND_ROWS();
    

    第一个查询将返回16 行,第二个查询将返回如果第一个查询中没有LIMIT 子句将返回的行数。

    您可以使用它来决定是否显示“下一个”链接。

    【讨论】:

    • +1。另见 MySQL 文档:[dev.mysql.com/doc/refman/5.6/en/…
    • -@Quassnoi,你如何返回第一个和第二个查询的结果?我只能看到FOUND_ROWS() 结果。
    • @timpeterson:我都看到了。你在看哪里?
    • @timpeterson 我发现的唯一方法是运行两个单独的查询,如果这对您有帮助的话。 (您可能应该将该过程包装在事务中,以保证没有其他人可以在两者之间偷偷进行第二个查询)
    • @RonLugge: FOUND_ROWS() 是会话范围,其他会话不影响它。
    【解决方案2】:

    运行一个单独的查询,没有限制仅返回计数。

    【讨论】:

    • 鉴于最受好评的答案,你能解释一下你为什么这么说吗?
    • @timpeterson 这也是一个有效的选项。它有一些不得不两次访问数据库的问题,但它仍然是一个完全有效的(如果“效率较低”)的答案。就效率而言,取决于您在做什么,有时评分最高的答案可能会违反 DRY,因为它会为您提供两种不同的方式来获取相同的信息。
    【解决方案3】:

    您是要完全分页,还是只使用this page 和next page?如果是后者,您可以简单地LIMIT 17 并计算结果的行数。如果你得到 17,你需要分页。

    【讨论】:

      【解决方案4】:

      除了获取其他人提到的计数的单独查询之外,您还需要抵消您所在页面的结果。

      $sql .= "posts p, images im, postimages pi WHERE
          i.active = 1 
          AND pi.post_id = p.id
          AND pi.image_id = im.image_id 
          ORDER BY created_at 
          LIMIT ". ($page - 1) * $pagesize .", ". $pagesize;
      

      关于 SQL 注入的正常警告将适用于此处。

      【讨论】:

        【解决方案5】:

        使用两个查询,一个是您的查询,另一个是:

        SELECT COUNT(primary_key) FROM ... WHERE...
        

        【讨论】:

          猜你喜欢
          • 2018-03-30
          • 2016-04-17
          • 2012-10-04
          • 1970-01-01
          • 2019-05-19
          • 1970-01-01
          • 1970-01-01
          • 2012-05-03
          • 2015-07-31
          相关资源
          最近更新 更多