早就知道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
工作?
计算讨论的方法
答案 0 :(得分:6)
喔。你在混淆一切。
COUNT(*)
时,你根本不应该使用rowcount,因为它没有任何意义。您必须转而检索查询结果。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子句列上有一个索引,它也会很快看到没有可用的索引。