Mysql
 sql >> Database >  >> RDS >> Mysql

Come eseguire una seconda query PDO mysql in un ciclo while da un'altra query?

Questa non è una limitazione PDO, è una limitazione della libreria client MySQL. MySQL supporta solo una query in corso alla volta. Non puoi eseguire un'altra query mentre la prima query ha ancora un cursore aperto (cioè ha ancora risultati da restituire).

Hai queste opzioni:

  • Usa PDOStatement::fetchAll() e raccogliere l'intero set di risultati della query esterna in un array PHP. Questo termina il risultato della query della query esterna. Quindi puoi eseguire un ciclo sull'array ed eseguire una query SQL aggiuntiva per ogni iterazione del ciclo.

    Ma l'esecuzione di una nuova query per ogni iterazione del ciclo del set di risultati esterno non è efficiente. È un buon modo per eliminare le prestazioni della tua applicazione.

    Alcune persone lo chiamano N+1 seleziona il problema perché esegui la prima selezione, che restituisce N righe, quindi esegui N selezioni in base ai risultati della prima selezione.

  • Se usi MySQL, usa PDO::MYSQL_ATTR_USE_BUFFERED_QUERY che sostanzialmente fa la stessa cosa, scarica tutte le righe, salvate internamente in un array. Quindi chiamate successive a fetch() basta scorrere i risultati nel buffer.

    Ma questo coinvolge anche l'antipattern Seleziona N+1.

  • È meglio scrivere una singola query SQL che ti ottenga i valori desiderati. Indovinando dai tuoi commenti, vuoi le categorie e il conteggio delle righe correlate da un'altra tabella in cui category_id corrisponde. Ecco un esempio di tale query 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");
    

I join sono una parte fondamentale di SQL. Se provi a usare SQL senza imparare a usare i join, è come usare PHP senza imparare a usare while loop.

Inizia qui:Una spiegazione visiva di Join SQL .