Как выполнить второй запрос PDO mysql в цикле while из другого запроса?

Таким образом, я пытаюсь использовать PDO MySQL, если я запускаю такой запрос:

$db->pquery("SELECT `category_id`, `category_name` FROM `database_categorys` ORDER BY `category_name` ASC"); while ($category = $db->fetch()) { } 

Внутри цикла while я не могу выполнить другой запрос или он отменяет предыдущий запрос, есть ли способ обойти это?

Это мой pckery btw:

 // A plain query public function pquery($sql) { $this->STH = $this->database->prepare($sql); $this->counter++; return $this->STH->execute(); } 

И моя функция fetch:

 public function fetch() { $this->STH->setFetchMode(PDO::FETCH_ASSOC); return $this->STH->fetch(); } 

Solutions Collecting From Web of "Как выполнить второй запрос PDO mysql в цикле while из другого запроса?"

Это не ограничение PDO, это ограничение клиентской библиотеки MySQL. MySQL поддерживает только один запрос в процессе за раз. Вы не можете выполнить другой запрос, в то время как первый запрос все еще имеет открытый курсор (т.е. он все еще имеет результаты для возврата).

У вас есть следующие варианты:

  • Используйте PDOStatement :: fetchAll () и собирайте весь набор результатов внешнего запроса в массиве PHP. Это завершает результат запроса внешнего запроса. Затем вы можете перебрать массив и запустить дополнительный SQL-запрос для каждой итерации цикла.

    Но запуск нового запроса для каждой итерации цикла внешнего результирующего набора неэффективен. Это хороший способ убить производительность вашего приложения.

    Некоторые люди называют это проблемой N + 1, потому что вы запускаете первый выбор, который возвращает N строк, а затем вы запускаете N выборок на основе результатов первого выбора.

  • Если вы используете MySQL, используйте PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY, который в основном делает то же самое, загружает все строки, сохраненные внутри массива. Затем последующие вызовы fetch() просто перебирают буферизованные результаты.

    Но это также включает в себя N + 1 Selects antipattern.

  • Лучше написать один SQL-запрос, который получит нужные вам значения. Угадав из ваших комментариев, вы хотите, чтобы категории и количество связанных строк находились в другой таблице, где соответствует category_id. Вот пример такого SQL-запроса:

     $db->pquery("SELECT c.`category_id`, c.`category_name`, COUNT(*) AS `count` FROM `database_categorys` AS c LEFT OUTER JOIN `other_table` AS t ON t.category_id = c.category_id GROUP BY c.category_id ORDER BY c.`category_name` ASC"); 

Соединения являются фундаментальной частью SQL. Если вы попытаетесь использовать SQL, не изучая использование объединений, это похоже на использование PHP без обучения использованию в циклах.

Начните здесь: визуальное объяснение соединений SQL .

Попробуйте выполнить второй запрос после того, while loop or fetching of records первого запроса while loop or fetching of records завершена.

Редактировать:

Для этого вам нужно использовать JOIN или объединить 2 запроса с помощью IN . Вот руководство