Mysql SELECT COUNT(*)OR SELECT 1? PDO

时间:2011-11-22 03:47:52

标签: php mysql count pdo

早就知道PDO不支持COUNT(*),如下所示的查询会失败,因为它不会返回任何受影响的行,

$q = $dbc -> prepare("SELECT COUNT(*) FROM table WHERE id = ?");
$q -> execute(array($id));
echo $q -> rowCount();

进行一些研究我发现你也可以使用其他计数方法来获取行计数而根本不使用计数,例如,下面的查询应该与上面相同,但对于PDO将返回正确的,

$q = $dbc -> prepare("SELECT 1 FROM table WHERE id = ?");
$q -> execute(array($id));
echo $q -> rowCount();

互联网上有各种各样的消息来源声称;

"SELECT COUNT(*)
"SELECT COUNT(col)
"SELECT 1

彼此都是一样的(有一些差异)所以如何使用mysql哪个PDO无法正确返回真正的计数呢

"SELECT 1 

工作?

计算讨论的方法

Why is Select 1 faster than Select count(*)?

3 个答案:

答案 0 :(得分:6)

喔。你在混淆一切。

  1. PDO不会干扰SQL查询。它支持SQL支持的一切。
  2. 在执行COUNT(*)时,你根本不应该使用rowcount,因为它没有任何意义。您必须转而检索查询结果。
  3. Dunno你所谈论的“各种来源”是什么,COUNT(*)COUNT(col)(甚至COUNT(1))是相同的,而是唯一正确的获取方式

    COUNT是一个聚合函数,它会为您计算行数。因此,它已经返回结果,不再需要计数。广告它只返回单行中的标量值。因此,在这一行上使用rowcount毫无意义

    SELECT 1与上述内容不同,因为它只为表格中的每一行选择了文字1 。因此,如果数据库中有数千行,它将返回一千1s。因此,rowcount将为您提供结果,但这将极大地浪费服务器资源。

    有一条简单的规则:

    始终请求您需要的唯一数据。

    如果需要行数 - 请求行数。以后不是一千个1来计算它们 听起来很明智吗?

答案 1 :(得分:5)

  

PDO不支持COUNT(*)

WTF?当然PDO支持COUNT(*),你使用的方式错误。

$q = $dbc->prepare("SELECT COUNT(id) as records FROM table WHERE id = ?");
$q->execute(array($id));    
$records = (int) $q->fetch(PDO::FETCH_OBJ)->records;

如果您使用的是MySQL以外的驱动程序,则可能需要先测试rowCount,如下所示。

$records = (int) ($q->rowCount()) ? $q->fetch(PDO::FETCH_OBJ)->records : 0;

答案 2 :(得分:0)

我认为最好的方法是测试数据库中是否存在一行。

SELECT 1 FROM table WHERE condition LIMIT 1

如果找到一行,它会停止并告诉你有一条线。如果没有,并且你的where子句列上有一个索引,它也会很快看到没有可用的索引。