sql >> Databasteknik >  >> RDS >> Mysql

Hur gör man en andra PDO mysql-fråga på en stund från en annan fråga?

Detta är inte en PDO-begränsning, det är en begränsning av MySQL-klientbiblioteket. MySQL stöder endast en pågående fråga åt gången. Du kan inte köra en annan fråga medan den första frågan fortfarande har en öppen markör (dvs. den har fortfarande resultat att returnera).

Du har dessa alternativ:

  • Använd PDOStatement::fetchAll() och samla in hela resultatuppsättningen av den yttre frågan i en PHP-array. Detta avslutar frågeresultatet för den yttre frågan. Sedan kan du loopa över arrayen och köra ytterligare en SQL-fråga för varje loopiteration.

    Men att köra en ny fråga för varje loopiteration av den yttre resultatuppsättningen är inte effektivt. Det är ett bra sätt att döda prestandan för din applikation.

    Vissa människor kallar detta för N+1 Selects Problem eftersom du kör det första urvalet, vilket returnerar N rader, och sedan kör du N urval baserat på resultatet av det första urvalet.

  • Om du använder MySQL, använd PDO::MYSQL_ATTR_USE_BUFFERED_QUERY som i princip gör samma sak, laddar ner alla rader, sparade i en array internt. Sedan efterföljande anrop till fetch() iterera bara över de buffrade resultaten.

    Men detta involverar också N+1 Selects-antimönster.

  • Det är bättre att skriva en enda SQL-fråga som ger dig de värden du vill ha. Utifrån dina kommentarer vill du ha kategorier och antalet relaterade rader från en annan tabell där kategori_id matchar. Här är ett exempel på en sådan SQL-fråga:

    $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 är en grundläggande del av SQL. Om du försöker använda SQL utan att lära dig använda joins är det som att använda PHP utan att lära dig använda while slingor.

Börja här:En visuell förklaring av SQL-anslutningar .



  1. Hur skulle du implementera sekvenser i Microsoft SQL Server?

  2. Hur skapar man en främmande nyckel med ON UPDATE CASCADE på Oracle?

  3. Perl DBD::Oracle Module installation

  4. MariaDB JSON_ARRAY_APPEND() Förklarad