sql >> データベース >  >> RDS >> Mysql

別のクエリからwhileループで2番目のPDOmysqlクエリを実行するにはどうすればよいですか?

    これは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結合



    1. SQLiteクエリ:行のすべての列を取得しますか(android)?

    2. 結果キャッシュ

    3. T-SQLのバグ、落とし穴、およびベストプラクティス–サブクエリ

    4. MySQLサーバーのthread_stackパラメーター-それは何ですか?どれくらいの大きさにすべきですか?