我从PHP和MySQL中的数据库中获取记录并将其显示在jqgrid中。
现在我要求在第一次请求中包含10行数据的1页。
实现我的one
查询以获取total number of records
然后计算
totalpages
,其中包含所有总记录。
和second
查询以触发有限的记录,即1 to 10
和下次11 to 20
等等。
所以问题是每次我必须触发两个查询,一个用于获取记录总数,另一个用于获取网格的有限行。
是否可以只触发一个查询来实现上述功能?
以正常方式获取记录上面的场景很好但是如果我预先形成serch那么我必须触发两个查询一个来获取符合条件的总行数,而另一个只获取满足条件的有限行< / p>
更新
我访问行的限制取决于记录总数,因此我没有看到任何选项只能触发一个查询。请查看我的PHP代码是如何计算限制的
1)触发查询以访问总记录
$selectMemberData = "SELECT * FROM tbl_member";
//some db code ...
// store the total records value
$count = $dbMemberData->numRows;
if( $count >0 ) {
$total_pages = ceil($count/$limit);
} else {
$total_pages = 0;
}
if ($page > $total_pages) $page=$total_pages;
$start = ( $limit * $page ) - $limit; // do not put $limit*($page - 1)
//Fire another query to fetch limited records
$selectMember = "SELECT * FROM tbl_member LIMIT " .$start.", ". $limit;
所以我担心的是,当我使用自动完成搜索时,触发两个查询会非常昂贵。问题是我依赖总记录来获得start
和end
限制
答案 0 :(得分:1)
select *
from yourtable
inner join
(
select count(*) as count
from yourtable
) as t2
limit 0,10
将在一个查询中为每一行添加一个额外的计数列,这将是整个表中的总行数。
如果您不想使用联接,可以使用联合:
select id,count(*) as data
from yourtable
union all
select *
from yourtable
limit 0, 10
但是你必须在第一个选择中声明所有列。你可以像null as column_name
那样为每个人编写它,除了你想要保留计数的列,如果你想让它们为空,否则他们只会保留随机数据。
我假设您在数据上使用了while
循环,因此您可以使用:
mysql_fetch_assoc($row);
$all_records_count = $row['data'];
while(mysql_fetch_assoc($row)){
...do something with results...}
得到第一行,它将保持你的计数,然后开始循环结果。
答案 1 :(得分:0)
答案 2 :(得分:0)
不一定必须触发两个查询。您可以触发单个存储过程并从中获取两个结果集。第一个包含有限记录,另一个包含总记录。
为此,您可以使用MySql的found_rows()
函数来查找使用LIMIT子句返回有限结果的查询中有多少实际记录。请在此处详细了解http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows。
E.g
SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
WHERE id > 100 LIMIT 10;
然后点开这个
SELECT found_rows();