Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment faire une seconde requête mysql PDO dans une boucle while à partir d'une autre requête ?

Ce n'est pas une limitation de PDO, c'est une limitation de la bibliothèque cliente MySQL. MySQL ne prend en charge qu'une seule requête en cours à la fois. Vous ne pouvez pas exécuter une autre requête tant que la première requête a toujours un curseur ouvert (c'est-à-dire qu'elle a encore des résultats à renvoyer).

Vous avez ces options :

  • Utilisez PDOStatement::fetchAll() et collecter l'ensemble des résultats de la requête externe dans un tableau PHP. Ceci termine le résultat de la requête de la requête externe. Ensuite, vous pouvez boucler sur le tableau et exécuter une requête SQL supplémentaire pour chaque itération de boucle.

    Mais exécuter une nouvelle requête pour chaque itération de boucle du jeu de résultats externe n'est pas efficace. C'est un bon moyen de tuer les performances de votre application.

    Certaines personnes appellent cela le N+1 Selects Problem car vous exécutez la première sélection, qui renvoie N lignes, puis vous exécutez N sélections en fonction des résultats de la première sélection.

  • Si vous utilisez MySQL, utilisez PDO::MYSQL_ATTR_USE_BUFFERED_QUERY qui fait essentiellement la même chose, télécharge toutes les lignes, enregistrées dans un tableau en interne. Puis appels ultérieurs à fetch() itérez simplement sur les résultats mis en mémoire tampon.

    Mais cela implique également l'anti-pattern N+1 Selects.

  • Il est préférable d'écrire une seule requête SQL qui vous donne les valeurs souhaitées. D'après vos commentaires, vous voulez des catégories et le nombre de lignes associées d'une autre table où category_id correspond. Voici un exemple d'une telle requête 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");
    

Les jointures sont une partie fondamentale de SQL. Si vous essayez d'utiliser SQL sans apprendre à utiliser les jointures, cela revient à utiliser PHP sans apprendre à utiliser while boucles.

Commencez ici :Une explication visuelle de Jointures SQL .