PDO MYSQL 嵌套的 COUNT 中断了我的查询

Posted

技术标签:

【中文标题】PDO MYSQL 嵌套的 COUNT 中断了我的查询【英文标题】:PDO MYSQL nested COUNT breaks my query 【发布时间】:2015-01-09 03:59:55 【问题描述】:

我有这样的查询:

$query = $con->prepare("SELECT `Id`, 
                                (SELECT count(`Id`) 
                                 FROM `images` 
                                 WHERE `parentId` = :recId) as `numImgs` 
                       FROM `records`
                       WHERE `id`= :recId LIMIT 1");

$query->execute(array('recId' => $recId));

$rec = $query->fetch(PDO::FETCH_ASSOC);

当我在没有嵌套 (SELECT Count(Id)) 的情况下执行此操作时,查询有效。 如果我拿出SELECT(COUNT(Id)) 自己做,它也可以。

由于某种原因,上述查询不起作用。我没有收到任何错误,只是没有结果。但是,如果我在 phpMyAdmin 中运行查询,它可以正常工作并返回两列,Id 和 numImgs,例如:

----------------
| id | numImgs |
----------------
| 50 |   10    |
----------------

我已经测试了我传递的值,它是从 $recId 正确填充的,所以那里没有问题。任何人都可以为我指出正确的方向吗?

谢谢!

注意:这很好用,但我不明白为什么我不能用一个查询来做到这一点:

try
  $query = $con->prepare("SELECT `Id` 
                                  FROM `records`
                                  WHERE `id`= :recId
                                  AND `ownerId` = :userId
                                  LIMIT 1");
  $query->execute(array('recId' => $recId, 'userId' => $userId));
  $rec = $query->fetch(PDO::FETCH_ASSOC);
catch(PDOException $e) 
  dump_exception('Exception selecting record.', $e);

if($rec)
  try
    $picQuery = $con->prepare("SELECT COUNT(`Id`)
                                      FROM `images` 
                                      WHERE `parentId`= :recId");
    $picQuery->execute(array('recId' => $recId));
    $numPics = $picQuery->fetchColumn();
  catch(PDOException $e) 
    dump_exception('Exception counting pictures.', $e);
  

【问题讨论】:

$query$villaQuery ? 抱歉,已更正。复制和粘贴时会发生这种情况 var_dump($query->rowCount()) = ? 还有var_dump($recId)? var_dump($query->rowCount()) 给出 int(0),var_dump($recId) 给出 string(3) “172”,这是我记录的记录的 id刚刚插入,var_dump $rec 给出 bool(false) 【参考方案1】:

感谢@RyanVincent 在下面的评论,我似乎找到了问题所在。虽然我有其他工作查询多次使用相同的参数而不必多次将其传递到“执行”数组中,但在这种情况下,似乎只列出一次参数会导致问题。我怀疑因为它是一个嵌套查询,所以它将它视为两个独立的查询,因此,一个无法访问另一个的参数。这只是一个猜测,我可能是错的,但根据我的结果似乎是有道理的。不仅参数必须列出两次,而且还必须唯一命名,否则您会遇到完全相同的问题。所以这段代码解决了这个问题:

$query = $con->prepare("SELECT `Id`, 
                                (SELECT count(`Id`) 
                                 FROM `images` 
                                 WHERE `parentId` = :recIdOne) as `numImgs` 
                       FROM `records`
                       WHERE `id`= :recIdTwo LIMIT 1");

$query->execute(array('recIdOne' => $recId, 'recIdTwo' => $recId));

$rec = $query->fetch(PDO::FETCH_ASSOC);

【讨论】:

【参考方案2】:

你不能使用JOINs 和GROUP BY 吗?如果我的问题正确,它看起来像这样。

SELECT `id`, COUNT(*) AS `numImgs`
FROM `records` r
INNER JOIN `images` i ON i.parentId = r.id
WHERE r.id = :recId
AND r.ownerId = :userId
GROUP BY r.id
LIMIT 1

【讨论】:

看起来它应该可以工作,并且在 myPhpAdmin 中也可以,但我在实际代码中得到了相同的结果:( 你的 mysql 日志开启了吗?查看发送到数据库服务器后的最终查询。您的 PDO 中一定有一些错误。 我使用的是免费的网络主机,但我似乎无法访问日志 :( 虽然我已启用登录 .htaccess 文件,但没有显示任何错误

以上是关于PDO MYSQL 嵌套的 COUNT 中断了我的查询的主要内容,如果未能解决你的问题,请参考以下文章

为啥这种“嵌套连接”适用于 PDO 而不适用于 MySql cli?

如何使用 PHP 和 MySQL 创建 JSON 嵌套子父树(PDO 方法)

如何使用PDO在PHP中获取结果数组?

如何计算 MySQL 表中的行数(PHP PDO)

PHP PDO - 关闭语句 - 不能创建超过 max_prepared_stmt_count 语句

PDO fetchAll 返回空数组,但是可以显示count数量?