在PDO SELECT COUNT(*)类型中使用fetch()的问题

时间:2013-10-09 00:03:51

标签: php mysql pdo

嘿伙计我有以下内容:

$sql = "SELECT COUNT(*) pk_ID FROM "._DB_NAME."."._DB_PREFIX."_Device
                  WHERE vc_Serial = :deviceID";
$sth=$DBH->prepare($sql);
$sth->execute(array(':deviceID' =>$device_id));

//give amount of results
$row = $sth->fetch(PDO::FETCH_ASSOC);
$count = $sth->rowCount();

使用此代码,我会看到使用$count生成了多少结果,而不是存储值$fk_DeviceID = $row['pk_ID'];问题是我没有收到正确的ID。我不知道SELECT COUNT(*)是否会影响任何东西。

赞赏的建议和想法!

1 个答案:

答案 0 :(得分:1)

首先,您似乎需要将查询更改为:

SELECT  
    COUNT(*) as pkCount,
    pk_ID 
FROM 
    "._DB_NAME."."._DB_PREFIX."_Device 
WHERE 
    vc_Serial = :deviceID
group by
    pk_id

由于您似乎想要获得两列,因此我在术语之间添加了一个逗号,然后在您指望列时添加了group by语句 - 因此您需要根据聚合对结果进行分组

其次,假设只有一个pk_ID。 $count变量只显示1,而不是数据库中计算的项目数,因为它计算记录集中有多少行。

你可能想要这样做:

echo $row['pkCount'];

这将显示查询本身计算/聚合的行数,这可能与查询实际返回的行数不同。

编辑(每条评论):

首先,SQL本身有点笨拙。虽然我不能真正地跳进去解释比我在这里做的更多但没有改变方向盘,我可以provide a link I think will be useful to you you这是一个非常冗长的Q& A我写的解释了很多SQL基础知识/中间人的查询和聚合和连接以及各种好东西。请阅读此内容,除了整理评论的第一部分外,还要做的不仅仅是。

至于我的答案的第二部分,当您在查询中执行聚合(例如计数匹配行)时,该行中的数字将返回如下:

ID    Count
1     5
2     8

因此,当你为一行获取一个数组时,你会得到这样的结果:

$array=('ID' => 1, 'Count' => 5)

但是,当你运行num_rows()时,它会计算记录集中的所有行 - 上面的行数为2,因为显示的结果中有两行。

我希望进一步有所帮助,如果你还想要更详细的东西,请告诉我,我会看到我能做些什么。