Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como fazer uma segunda consulta mysql PDO em um loop while de outra consulta?


Esta não é uma limitação do PDO, é uma limitação da biblioteca cliente MySQL. O MySQL suporta apenas uma consulta em andamento por vez. Você não pode executar outra consulta enquanto a primeira consulta ainda tem um cursor aberto (ou seja, ainda tem resultados para retornar).

Você tem essas opções:

  • Use PDOStatement::fetchAll() e colete todo o conjunto de resultados da consulta externa em uma matriz PHP. Isso conclui o resultado da consulta externa. Em seguida, você pode fazer um loop sobre a matriz e executar uma consulta SQL adicional para cada iteração de loop.

    Mas executar uma nova consulta para cada iteração de loop do conjunto de resultados externo não é eficiente. É uma boa maneira de matar o desempenho do seu aplicativo.

    Algumas pessoas chamam isso de Problema de seleção N+1 porque você executa a primeira seleção, que retorna N linhas, e depois executa N seleções com base nos resultados da primeira seleção.

  • Se você usa MySQL, use PDO::MYSQL_ATTR_USE_BUFFERED_QUERY que basicamente faz a mesma coisa, baixa todas as linhas, salvas em um array internamente. Em seguida, chamadas subsequentes para fetch() apenas iterar sobre os resultados armazenados em buffer.

    Mas isso também envolve o antipadrão N+1 Selects.

  • É melhor escrever uma única consulta SQL que obtenha os valores desejados. Deduzindo de seus comentários, você deseja categorias e a contagem de linhas relacionadas de outra tabela em que category_id corresponda. Aqui está um exemplo de uma consulta 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");
    

As junções são uma parte fundamental do SQL. Se você tentar usar SQL sem aprender a usar junções, é como usar PHP sem aprender a usar while rotações.

Comece aqui:Uma explicação visual de Junções SQL .