我有一个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个查询而不是单个查询:
$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语句同时获取计数和行?
答案 0 :(得分:1)
如果您有一个单独的查询计数,那么您可以完全按照从任何查询中读取值的方式检索其值,没有区别。
如果您使用SQL_CALC_FOUND_ROWS,那么您需要有一个单独的查询来调用FOUND_ROWS()函数:
SELECT FOUND_ROWS();
由于这又是一个普通的查询,你可以像现在一样阅读它的输出。
您可以通过在查询中添加count(*)字段来技术上检索查询本身中的记录计数:
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行,则可能是可接受的负担。
您需要测试哪种方法最适合您。