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】:你不能使用JOIN
s 和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 方法)