sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo hacer una segunda consulta PDO mysql en un ciclo while desde otra consulta?

Esta no es una limitación de PDO, es una limitación de la biblioteca cliente de MySQL. MySQL solo admite una consulta en curso a la vez. No puede ejecutar otra consulta mientras la primera consulta todavía tiene un cursor abierto (es decir, todavía tiene resultados para devolver).

Tienes estas opciones:

  • Use PDOStatement::fetchAll() y recopile todo el conjunto de resultados de la consulta externa en una matriz de PHP. Esto finaliza el resultado de la consulta de la consulta externa. Luego, puede recorrer la matriz y ejecutar una consulta SQL adicional para cada iteración del ciclo.

    Pero ejecutar una nueva consulta para cada iteración de bucle del conjunto de resultados externo no es eficiente. Es una buena manera de matar el rendimiento de su aplicación.

    Algunas personas llaman a esto el N+1 Selects Problem porque ejecuta la primera selección, que devuelve N filas, y luego ejecuta N selecciones en función de los resultados de la primera selección.

  • Si usa MySQL, use PDO::MYSQL_ATTR_USE_BUFFERED_QUERY que básicamente hace lo mismo, descarga todas las filas, guardadas en una matriz internamente. Luego llamadas posteriores a fetch() simplemente iterar sobre los resultados almacenados en búfer.

    Pero esto también implica el antipatrón N+1 Selects.

  • Es mejor escribir una única consulta SQL que le proporcione los valores que desea. Adivinando a partir de sus comentarios, desea categorías y el recuento de filas relacionadas de otra tabla donde coincida category_id. He aquí un ejemplo de una consulta SQL de este tipo:

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

Las uniones son una parte fundamental de SQL. Si intenta usar SQL sin aprender a usar combinaciones, es como usar PHP sin aprender a usar while bucles.

Comience aquí:Una explicación visual de Uniones SQL .