【问题标题】:fire single query to fetch records for grid pagination触发单个查询以获取网格分页的记录
【发布时间】:2012-09-20 19:23:49
【问题描述】:

我正在从 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 限制

【问题讨论】:

  • 如您所见,我们已经就您在此问题中寻找的确切内容展开了辩论。如果您在评论中让我们知道,这样我们就可以改进我们的答案,或者对某些内容进行投票或将答案标记为正确,因为我真的不想进行这场辩论。

标签: php jquery mysql database


【解决方案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...}

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

【讨论】:

  • 这里面基本上还有两个查询。试试explain这个你就知道了
  • @Shades88 两个内部查询与您的两个外部查询相比?仅取决于OP的含义,但是我们一起涵盖了两个基础。如果他想要执行一个 php 查询,那么这就是要走的路。由 OP 决定他喜欢什么。
  • 你是对的。但就标准做法而言,程序员应该直接调用存储过程而不是查询。在您的情况下,每条记录中都添加了行计数字段,这是完全没有必要的。相反,可以有一个只包含 row_count 字段的不同结果集和一个只包含一个人想要的主要结果集
  • @Shades88 从什么时候开始使用存储过程的标准做法 - 证据?只需在 stackoverflow 上搜索该术语,您就会看到社区对其使用的分歧程度。此外,此问题未标记为stored-procedures,并且从描述看来,OP 可能正在触发 php 页面上的查询,因此不使用存储的过程。我了解我的查询在做什么,但是 OP 要求能够编写一个查询来获得两个结果,我的解释是他的意思是一个 php 查询。正如我所说,如果我错了,那么我们已经涵盖了两个基础。
  • 您是否暗示从前端触发复杂的多连接查询?使用多行连接的 sql 语句使应用程序代码变得丑陋?为不同的查询建立多个数据库连接?使用 SP 有明显的优势,这可能就是人们喜欢 SP 的原因。至少我本人见过所有开发人员将后端逻辑放在 SP 中,然后从应用程序代码中调用它。试试这个,这是一篇关于 SO 本身的文章stackoverflow.com/questions/462978/…
【解决方案2】:

【讨论】:

    【解决方案3】:

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

    为此,您可以使用 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();
    

    【讨论】:

    • 以某种方式触发两个查询不是吗?第二为found_rows()
    • 没办法。但是,如果你把它放在一个存储过程中,你将只需要建立一个数据库连接而不是两个。程序中最昂贵的部分是与 DB 的连接,其次是 DB 延迟。所以至少,你可以减少那部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 2011-11-12
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多