Mysql SELECT COUNT(*)OR SELECT 1?PDO

Nov*_*ode 2 php mysql pdo count

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

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

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

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

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

"SELECT COUNT(*)
"SELECT COUNT(col)
"SELECT 1
Run Code Online (Sandbox Code Playgroud)

两者都是相同的(有一些差异)所以如何使用mysql哪个PDO无法正确返回真正的计数,

"SELECT 1 
Run Code Online (Sandbox Code Playgroud)

工作?

计数讨论的方法

为什么选择1比选择计数(*)更快?

You*_*nse 6

哦.你搞砸了一切.

  1. PDO不会干扰SQL查询.它支持SQL支持的一切.
  2. 在做的时候COUNT(*)你根本不应该使用rowcount,因为它没有任何意义.您必须改为检索查询结果.
  3. 不知道什么是"各种渠道"你所谈论的,但COUNT(*)COUNT(col)(甚至COUNT(1))是相同的,唯一正确的方式来获得计数,当你需要没有记录自己的记录.

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

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

有一个简单的规则可以遵循:

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

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


xma*_*cos 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;
Run Code Online (Sandbox Code Playgroud)

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

$records = (int) ($q->rowCount()) ? $q->fetch(PDO::FETCH_OBJ)->records : 0;
Run Code Online (Sandbox Code Playgroud)