sql >> Databáze >  >> RDS >> Mysql

Jak provést druhý dotaz PDO mysql ve smyčce while z jiného dotazu?

Toto není omezení PDO, je to omezení klientské knihovny MySQL. MySQL podporuje vždy pouze jeden probíhající dotaz. Nemůžete provést další dotaz, dokud má první dotaz stále otevřený kurzor (tj. stále má výsledky k vrácení).

Máte tyto možnosti:

  • Použijte PDOStatement::fetchAll() a shromáždit celou sadu výsledků vnějšího dotazu v poli PHP. Tím je výsledek dotazu vnějšího dotazu dokončen. Poté můžete pole opakovat a spustit další dotaz SQL pro každou iteraci smyčky.

    Ale spuštění nového dotazu pro každou iteraci smyčky vnější sady výsledků není efektivní. Je to dobrý způsob, jak snížit výkon vaší aplikace.

    Někteří lidé tomu říkají N+1 Selects Problem protože spustíte první výběr, který vrátí N řádků, a poté spustíte N výběrů na základě výsledků prvního výběru.

  • Pokud používáte MySQL, použijte PDO::MYSQL_ATTR_USE_BUFFERED_QUERY který v podstatě dělá to samé, stáhne všechny řádky, interně uložené v poli. Poté následná volání fetch() stačí opakovat výsledky ve vyrovnávací paměti.

    Ale to také zahrnuje antivzor N+1 Selects.

  • Je lepší napsat jeden SQL dotaz, který vám poskytne požadované hodnoty. Podle vašich komentářů chcete kategorie a počet souvisejících řádků z jiné tabulky, kde se id kategorie shoduje. Zde je příklad takového SQL dotazu:

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

Spojení jsou základní součástí SQL. Pokud se pokusíte používat SQL, aniž byste se naučili používat spojení, je to jako používat PHP, aniž byste se naučili používat while smyčky.

Začněte zde:Vizuální vysvětlení SQL spojení .



  1. Jak zadat název primárního klíče v EF-Code-First

  2. Práce kolem zmeškaných optimalizací

  3. Jak zrychlit SQL dotazy? indexy?

  4. Jak monitorovat sdružování připojení pro .NET MySQL Data Connector ve službě IIS