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

Hvordan laver man en anden PDO mysql-forespørgsel på et stykke tid fra en anden forespørgsel?

Dette er ikke en PDO-begrænsning, det er en begrænsning af MySQL-klientbiblioteket. MySQL understøtter kun én igangværende forespørgsel ad gangen. Du kan ikke udføre en anden forespørgsel, mens den første forespørgsel stadig har en åben markør (dvs. den har stadig resultater at returnere).

Du har disse muligheder:

  • Brug PDOStatement::fetchAll() og saml hele resultatsættet af den ydre forespørgsel i et PHP-array. Dette afslutter forespørgselsresultatet af den ydre forespørgsel. Derefter kan du sløjfe over arrayet og køre en ekstra SQL-forespørgsel for hver sløjfeiteration.

    Men at køre en ny forespørgsel for hver loop-iteration af det ydre resultatsæt er ikke effektivt. Det er en god måde at dræbe din applikations ydeevne.

    Nogle mennesker kalder dette N+1-valgsproblemet fordi du kører den første markering, som returnerer N rækker, og derefter kører du N markeringer baseret på resultaterne af den første markering.

  • Hvis du bruger MySQL, skal du bruge PDO::MYSQL_ATTR_USE_BUFFERED_QUERY som grundlæggende gør det samme, downloader alle rækkerne, gemt i et array internt. Derefter efterfølgende opkald til fetch() bare gentag de bufferede resultater.

    Men dette involverer også N+1 Selects antimønsteret.

  • Det er bedre at skrive en enkelt SQL-forespørgsel, der giver dig de værdier, du ønsker. Ud fra dine kommentarer vil du have kategorier og antallet af relaterede rækker fra en anden tabel, hvor kategori_id matcher. Her er et eksempel på sådan en SQL-forespørgsel:

    $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 er en grundlæggende del af SQL. Hvis du prøver at bruge SQL uden at lære at bruge joins, er det ligesom at bruge PHP uden at lære at bruge while sløjfer.

Start her:En visuel forklaring af SQL-joins .



  1. NLS_CHARSET_DECL_LEN() Funktion i Oracle

  2. Hvordan kan jeg bruge forberedte erklæringer i CodeIgniter

  3. Hjælp til MySQL-opdateringssag

  4. Giv valg på alle borde, der ejes af en bestemt bruger