【问题标题】:Counting all rows with a limit计算有限制的所有行
【发布时间】:2015-12-13 09:22:37
【问题描述】:

我需要过滤(使用 where 子句)表中的行,计算此过滤器的总行数,然后限制分页的行数。

什么是最快/更有效的?

  1. 使用 sql 查询计算行数。使用 sql 查询选择有限制的行。
  2. 使用 sql 查询选择所有行。用 PHP 计算数组。用 PHP 拆分数组。

或者有没有其他方法来计算所有行并得到一组有限的结果?

【问题讨论】:

  • 1 是这样您就知道您有多少页,2 在限制范围内选择 -> petefreitag.com/item/451.cfm 显示在第 x 页上
  • 你想要这个功能:dev.mysql.com/doc/refman/5.0/en/… 有它,不需要运行你的查询两次。
  • 我知道你问的不是框架,但你应该考虑使用一个,比如 Laravel (laravel.com/docs/5.1/queries#ordering-grouping-limit-and-offset)。这样的操作会容易很多。
  • 我在使用 Laravel,不幸的是 eloquent 不适合复杂的查询,所以必须使用 raw。
  • @PedroMoreira 这确实是一个数据库问题,而不是框架问题。无论框架如何,答案都是一样的,例如我在 F3 框架、WordPress、Java 等中使用示例中的代码。

标签: php mysql


【解决方案1】:

MySQL LIMIT 应该可以为您解决问题。这是一种更有效的方法,因为它有助于仅获取要显示的相关记录,而不是其他任何内容。

请注意,startingIndexnumberOfRecordsPerPage 变量应在执行查询之前设置。

SELECT * FROM MY_TABLE where 
(...) //ALL CONDITIONS go here
LIMIT startingIndex, numberOfRecordsPerPage;

来自MySQL Reference

有两个参数,第一个参数指定的偏移量 第一行返回,第二行指定最大数量 要返回的行。初始行的偏移量为0(不是1):

SELECT * FROM tbl LIMIT 5,10; # 检索第 6-15 行

为了确定是否期望返回任何记录,必须首先运行查询(使用COUNT 并且没有任何LIMIT 条件):

`SELECT COUNT(*) FROM MY_TABLE where (...) //ALL CONDITIONS go here`

单独存放。这应是适用于给定的WHERE 子句的总记录。

如果总和startingIndex+numberOfRecordsPerPage>= TOTAL_COUNT,则该分页集应为整个列表的最后一个,并且不应允许用户单击NEXT 按钮。

PS:另外,正如 cmets 中所指出的,您可能希望查看一个框架替代方案,例如 Criteria API for Java,用于重举重,特别是如果您的 WHERE 条件也是动态生成的.

【讨论】:

  • 我不认为这回答了“你怎么知道总行数但只返回 X 行?”这个问题的初衷。问题是如果总共只有 12 行,你怎么知道 LIMIT 5,10 将返回 6-15(它不能)?
【解决方案2】:

您应该使用SQL_CALC_FOUND_ROWSFOUND_ROWS() 函数来返回总行数,即使对返回的结果应用了限制。运行查询后将返回结果,然后您可以运行 SELECT FOUND_ROWS() 以返回总行数,而无需再次运行查询。

SELECT SQL_CALC_FOUND_ROWS * FROM my_table WHERE column = 'something' LIMIT 10;
SELECT FOUND_ROWS() AS total_results;

【讨论】:

    【解决方案3】:

    使用两个查询,一个用于检索总行数,另一个用于获取行数。 LIMIT 子句中的第一个参数指定第一行的偏移量(current_page * post_per_page),第二个参数指定要返回的最大行数(post_per_page)。

    SELECT COUNT(*) AS num_rows FROM table;
    
    SELECT * FROM table LIMIT start, length;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      • 2020-12-09
      • 2011-09-02
      相关资源
      最近更新 更多