PDO MYSQL вложенный COUNT разбивает мой запрос

У меня есть запрос, как это:

$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);
}

2

Решение

Вы не можете использовать JOINс и 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
0

Другие решения

Похоже, я нашел проблему благодаря комментарию @ RyanVincent ниже. В то время как у меня есть другие рабочие запросы, которые используют один и тот же параметр более одного раза, и его не нужно передавать в массив «execute» более одного раза, в этом случае кажется, что только перечисление параметра один раз вызывает проблему. Я подозреваю, что, поскольку это вложенный запрос, он обрабатывает его как два независимых запроса, и поэтому один не имеет доступа к параметрам другого. Это всего лишь предположение, я могу ошибаться, но, похоже, это имеет смысл на основе моих результатов. Параметр должен быть не только указан дважды, но и иметь уникальное имя, иначе вы получите точно такую ​​же проблему. Таким образом, этот код решил проблему:

$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);
0

По вопросам рекламы [email protected]