0

为了显示 PDO 的结果,我总是使用以下 PHP 代码,例如:

$STH = $DBH->prepare("SELECT logo_id, guess_count, guessed, count(id) AS counter FROM guess WHERE user_id=:id");
$STH->bindParam(":id",$loginuser['id']);
$STH->execute();
while($row = $STH->fetch()){
    print_r($row);
}

现在的问题是我只得到一个结果。我曾经用来$STH->rowCount()检查返回的行数,但这种方法并不真正建议用于SELECT语句,因为在某些数据库中它不能正确反应。所以我使用了count(id) AS counter,但现在我每次只得到一个结果,即使 的值$row['counter']大于一。

在一个查询中计算结果数量的正确方法是什么?

4

2 回答 2

1

你必须使用GROUP BY. 您的查询应如下所示

SELECT logo_id, guess_count, guessed, COUNT(id) AS counter 
  FROM guess 
 WHERE user_id=:id
 GROUP BY logo_id, guess_count, guessed
于 2013-07-26T22:05:08.007 回答
1

如果要检查查询返回的行数,有几个选项。


你可以做一个->fetchAll得到所有行的数组。(这对于大型结果集(即查询返回的很多行)是不可取的;您可以在查询中添加一个 LIMIT 子句以避免返回超过一定数量的行,如果您要检查的是您是否返回多行,您只需要检索两行。)检查数组的长度是微不足道的。


另一种选择是运行另一个单独的查询,以单独获取计数,例如

SELECT COUNT(1) AS counter FROM guess WHERE user_id=:id

但是,这种方法需要对数据库进行另一次往返。


旧备用SQL_CALC_ROUND_ROWS是另一种选择,尽管它也可能在大型集合中出现问题。


您也可以在现有代码中添加一个循环计数器:

$i = 0;
while($row = $STH->fetch()){
  $i++
  print_r($row);
}
print "fetched row count: ".$i;

如果您需要的是在运行查询以返回行之前满足特定谓词的行数的精确计数,那么单独的 COUNT(1) 查询可能是最合适的方法。是的,这是您应用程序中的额外代码;我建议您在代码前加上一个注释,表明代码的用途......在运行将检索行的查询之前,获得满足一组谓词的行的精确计数。

如果无论如何我都必须处理行,并且LIMIT 0,100可以接受添加到查询中,我会选择->fetchAll(),从数组的长度中获取计数,然后处理数组中的行。

于 2013-07-26T22:15:40.173 回答