Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie mache ich eine zweite PDO-Mysql-Abfrage in einer While-Schleife von einer anderen Abfrage?

Dies ist keine PDO-Einschränkung, sondern eine Einschränkung der MySQL-Client-Bibliothek. MySQL unterstützt jeweils nur eine laufende Abfrage. Sie können keine weitere Abfrage ausführen, während die erste Abfrage noch einen offenen Cursor hat (d. h. sie hat noch Ergebnisse zurückzugeben).

Sie haben folgende Möglichkeiten:

  • Verwenden Sie PDOStatement::fetchAll() und sammeln Sie die gesamte Ergebnismenge der äußeren Abfrage in einem PHP-Array. Damit ist das Abfrageergebnis der äußeren Abfrage fertig. Dann können Sie das Array durchlaufen und für jeden Schleifendurchlauf eine zusätzliche SQL-Abfrage ausführen.

    Das Ausführen einer neuen Abfrage für jede Schleifeniteration der äußeren Ergebnismenge ist jedoch nicht effizient. Dies ist eine gute Möglichkeit, die Leistung Ihrer Anwendung zu beeinträchtigen.

    Manche nennen das das N+1-Selects-Problem weil Sie die erste Auswahl ausführen, die N Zeilen zurückgibt, und dann N Auswahlen basierend auf den Ergebnissen der ersten Auswahl ausführen.

  • Wenn Sie MySQL verwenden, verwenden Sie PDO::MYSQL_ATTR_USE_BUFFERED_QUERY was im Grunde dasselbe tut, lädt alle Zeilen herunter, die intern in einem Array gespeichert sind. Dann nachfolgende Aufrufe von fetch() iterieren Sie einfach über die gepufferten Ergebnisse.

    Aber das beinhaltet auch das N+1 Selects Antipattern.

  • Es ist besser, eine einzelne SQL-Abfrage zu schreiben, die Ihnen die gewünschten Werte liefert. Aus Ihren Kommentaren erraten, möchten Sie Kategorien und die Anzahl verwandter Zeilen aus einer anderen Tabelle, in der category_id übereinstimmt. Hier ist ein Beispiel für eine solche SQL-Abfrage:

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

Joins sind ein grundlegender Bestandteil von SQL. Wenn Sie versuchen, SQL zu verwenden, ohne die Verwendung von Joins zu lernen, ist dies so, als würden Sie PHP verwenden, ohne zu lernen, wie man while verwendet Schleifen.

Beginnen Sie hier:Eine visuelle Erklärung von SQL-Joins .