我需要过滤(使用where子句)表格中的行,计算此过滤器的总行数,然后限制分页的行数。
什么是最快/更有效?
或者是否有其他方法可以计算所有行并获得有限的结果集?
答案 0 :(得分:0)
即使将LIMIT应用于返回的结果,也应使用SQL_CALC_FOUND_ROWS
和FOUND_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
应该为你做的伎俩。这是一种更有效的方法,因为它有助于仅提取要显示的相关记录而不是其他内容。
请注意,应在执行查询之前设置startingIndex
,numberOfRecordsPerPage
个变量。
SELECT * FROM MY_TABLE where
(...) //ALL CONDITIONS go here
LIMIT startingIndex, numberOfRecordsPerPage;
使用两个参数,第一个参数指定的偏移量 第一行返回,第二行指定最大数量 要返回的行。初始行的偏移量为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}条件也是动态生成的。