sql >> Database >  >> RDS >> Mysql

Hoe doe je een tweede PDO mysql-query in een while-lus van een andere query?

Dit is geen PDO-beperking, het is een beperking van de MySQL-clientbibliotheek. MySQL ondersteunt slechts één actieve query tegelijk. U kunt geen andere query uitvoeren terwijl de eerste query nog steeds een open cursor heeft (d.w.z. er moeten nog steeds resultaten worden geretourneerd).

Je hebt deze opties:

  • Gebruik PDOStatement::fetchAll() en verzamel de hele resultatenset van de buitenste query in een PHP-array. Hiermee is het queryresultaat van de buitenste query voltooid. Vervolgens kunt u de array doorlopen en een extra SQL-query uitvoeren voor elke lus-iteratie.

    Maar het uitvoeren van een nieuwe query voor elke lusiteratie van de buitenste resultaatset is niet efficiënt. Het is een goede manier om de prestaties van uw toepassing te verminderen.

    Sommige mensen noemen dit het N+1 Selects-probleem omdat u de eerste selectie uitvoert, die N rijen retourneert, en vervolgens N selecties uitvoert op basis van de resultaten van de eerste selectie.

  • Als je MySQL gebruikt, gebruik dan PDO::MYSQL_ATTR_USE_BUFFERED_QUERY die in feite hetzelfde doet, alle rijen downloadt, intern opgeslagen in een array. Daarna volgende aanroepen naar fetch() herhaal gewoon de gebufferde resultaten.

    Maar dit omvat ook het antipatroon N+1 Selects.

  • Het is beter om een ​​enkele SQL-query te schrijven die u de gewenste waarden geeft. Afgaande op uw opmerkingen, wilt u categorieën en het aantal gerelateerde rijen uit een andere tabel waarin categorie_id overeenkomt. Hier is een voorbeeld van zo'n SQL-query:

    $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 zijn een fundamenteel onderdeel van SQL. Als je SQL probeert te gebruiken zonder te leren joins te gebruiken, is dit hetzelfde als PHP gebruiken zonder te leren gebruiken while lussen.

Begin hier:Een visuele uitleg van SQL-joins .



  1. Toon geavanceerde serverconfiguratie-opties in SQL Server (T-SQL)

  2. Hoe de INSERT-bewerking in de MySql-trigger afbreken?

  3. Updatebewerkingen uitvoeren op kolommen van het type JSONB in ​​Postgres 9.4

  4. Meerdere SQL-query's in één instructie uitvoeren met PHP