使用COUNT()时显示多行的PDO SQL问题

时间:2013-07-26 22:01:06

标签: sql pdo count

要从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']的值大于1。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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(),从数组的长度获取计数,然后处理行来自阵列。