これはPDOの制限ではなく、MySQLクライアントライブラリの制限です。 MySQLは、一度に1つの実行中のクエリのみをサポートします。最初のクエリにカーソルが開いている間(つまり、返される結果がまだある間)は、別のクエリを実行できません。
次のオプションがあります:
-
PDOStatement ::fetchAll() を使用します 外部クエリの結果セット全体をPHP配列に収集します。これで、外部クエリのクエリ結果が終了します。次に、配列をループして、ループの反復ごとに追加のSQLクエリを実行できます。
ただし、外部結果セットのループ反復ごとに新しいクエリを実行するのは効率的ではありません。これは、アプリケーションのパフォーマンスを低下させる良い方法です。
これを
N + 1 SelectsProblem> N行を返す最初の選択を実行してから、最初の選択の結果に基づいてN個の選択を実行するためです。 -
MySQLを使用する場合は、 PDO ::MYSQL_ATTR_USE_BUFFERED_QUERY を使用してください。 これは基本的に同じことを行い、内部で配列に保存されたすべての行をダウンロードします。その後、
fetch()
を呼び出します バッファリングされた結果を繰り返すだけです。ただし、これにはN +1Selectsアンチパターンも含まれます。
-
必要な値を取得する単一の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を使用しようとすると、これはwhile
の使用方法を学習せずにPHPを使用するようなものです。 ループします。
ここから開始:視覚的な説明SQL結合 。