我有一个 PDO 片段,它从 MySQL 表中检索一堆行并将字段值(每行返回 2 个字段)分配给两个数组,如下所示:
$connect = dbconn(PROJHOST,'dbcontext', PROJDBUSER, PROJDBPWD);
$sql= "SELECT contextleft, contextright FROM tblcontext WHERE contextleft REGEXP :word LIMIT 0, 25";
$xleft = array();
$xright = array();
$countrows = 0;
$word = "[[:<:]]".$term."[[:>:]]";
$query = $connect->prepare($sql);
$query->bindParam(":word", $word, PDO::PARAM_STR);
if($query->execute()) {
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
foreach($rows as $row){
$pattern = '/\b'. $term .'\b/ui';
$replacer = function($matches) { return '<span class="highlight">' . $matches[0] . '</span>'; };
$xleft[$countrows] = preg_replace_callback($pattern, $replacer, $row['contextleft']);
$xright[$countrows] = $row['contextright'];
$countrows++;
}
$notfound = null;
}
$connect = null;
这很完美。如您所见,我使用 LIMIT 子句来确保最多只提取 25 行。但是,表中实际上可以有更多的匹配记录,我还需要检索所有 匹配记录的总数以及返回的行。最终目标是分页,例如:返回 100 个条目中的 25 个...
我知道我在这里有 2 个选项,都涉及 2 个查询而不是一个查询:
$sql= "SELECT COUNT(*) FROM tblcontext WHERE contextleft REGEXP :word;
SELECT contextleft, contextright FROM tblcontext WHERE contextleft REGEXP :word LIMIT 0, 25";
或者...
$sql= "SELECT SQL_CALC_FOUND_ROWS contextleft, contextright FROM tblcontext WHERE contextleft REGEXP :word LIMIT 0, 25;
SELECT FOUND_ROWS();";
但我仍然对在 PHP 中检索返回的计数值感到困惑。就像我可以通过在查询上运行 fetchAll()
方法并引用字段名称来访问字段一样。如何访问 FOUND_ROWS()
或 COUNT()
返回的计数值?另外,有什么方法可以使用单个 SQL 语句同时获取计数和行数吗?
最佳答案
如果您有一个单独的计数查询,那么您可以使用与从任何查询中读取值完全相同的方式检索它的值,没有区别。
如果您使用 SQL_CALC_FOUND_ROWS,那么您需要有一个单独的查询来调用 FOUND_ROWS()功能:
SELECT FOUND_ROWS();
由于这又是一个普通查询,您可以像现在一样读取它的输出。
从技术上讲,您可以通过向查询添加一个计数 (*) 字段来检索查询本身的记录数:
SELECT contextleft, contextright, (select count(*) from tblcontext) as totalrecords FROM tblcontext WHERE contextleft REGEXP :word LIMIT 0, 25
或
SELECT contextleft, contextright, totalrecords
FROM tblcontext WHERE contextleft, (select count(*) as totalrecords from tblcontext) t REGEXP :word LIMIT 0, 25
Limit 影响返回的记录数,但不影响 count() 函数统计的行数。唯一的缺点是每行都会有计数值,但在 25 行的情况下,这可能是可以接受的负担。
您需要测试哪种方法最适合您。
关于php - 使用 PDO 检索匹配行的总数以及行本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34787441/