计算具有限制的所有行

时间:2015-09-16 16:59:19

标签: php mysql

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

什么是最快/更有效?

  1. 使用sql查询计算行数。选择带有sql查询限制的行。
  2. 使用sql查询选择所有行。用PHP计算数组。用PHP拆分数组。
  3. 或者是否有其他方法可以计算所有行并获得有限的结果集?

3 个答案:

答案 0 :(得分:0)

即使将LIMIT应用于返回的结果,也应使用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;

答案 1 :(得分:0)

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

SELECT COUNT(*) AS num_rows FROM table;

SELECT * FROM table LIMIT start, length;

答案 2 :(得分:-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:另外,正如评论中所指出的,您可能希望查看一个框架替代方案,例如Criteria Java用于WHERE的重量级举重,特别是如果您的{{1}条件也是动态生成的。