0

我正在从 PHP 和 MySQL 的数据库中获取记录并将其显示到 jqgrid 中。

现在我请求 1 页,其中包含第一个请求中的 10 行数据。

为了实现这一点,我触发one查询以获取total number of records然后计算 totalpages其中包含所有总记录。

second查询以触发有限的记录,即1 to 10下一次11 to 20等等。

所以问题是每次我必须触发两个查询,一个来获取记录总数,另一个来获取网格的有限行。

是否可以只触发一个查询来实现上述目标?

要以正常方式获取记录,上述情况很好,但如果我执行 serch,那么我必须触发两个查询,一个来获取符合条件的总行数,另一个只获取满足条件的有限行

更新

好吧,我对访问行的限制取决于记录的总数,因此我看不到任何仅触发一个查询的选项。请看看我的 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;

所以我担心的是,当我当时使用自动完成搜索时,触发这两个查询会非常昂贵。问题是我依赖总记录来获取startend限制

4

3 回答 3

1
select * 
from yourtable 
inner join 
(
select count(*) as count 
from yourtable
) as t2
limit 0,10

这将在一个查询中为每一行添加额外的计数列,这将是整个表中的行总数。

以 sqlfiddle为例

如果您不想使用连接,可以使用联合:

select id,count(*) as data 
from yourtable
union all
select * 
from yourtable
limit 0, 10

但是您必须在第一个选择中声明所有列。您可以null as column_name为它们中的每一个编写它,但如果您希望它们为空,则除了要保存计数的列之外,它们将只保存随机数据。

sqlfiddle

我假设您正在while对数据使用循环,因此您可以使用:

mysql_fetch_assoc($row);
$all_records_count = $row['data'];
while(mysql_fetch_assoc($row)){
...do something with results...}

获取将保留您的计数的第一行,然后开始循环遍历结果。

于 2012-09-20T19:35:54.200 回答
0

查看SQL_CALC_FOUND_ROWS

于 2012-09-20T19:30:02.193 回答
0

不一定您必须触发两个查询。您可以触发单个存储过程并从中获取两个结果集。第一个包含有限的记录,另一个包含全部记录。

为此,您可以使用 MySql 的found_rows()函数来找出查询中使用 LIMIT 子句返回有限结果的实际记录的数量。在这里阅读更多关于它的信息http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

例如

SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
WHERE id > 100 LIMIT 10;

然后开火

SELECT found_rows();
于 2012-09-20T19:30:23.213 回答