Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да направя втора PDO mysql заявка в цикъл while от друга заявка?

Това не е ограничение на PDO, а ограничение на клиентската библиотека на MySQL. MySQL поддържа само една заявка в ход в даден момент. Не можете да изпълните друга заявка, докато първата заявка все още има отворен курсор (т.е. все още има резултати за връщане).

Имате следните опции:

  • Използвайте PDOStatement::fetchAll() и съберете целия набор от резултати от външната заявка в PHP масив. Това завършва резултата от заявката на външната заявка. След това можете да преминете през масива и да изпълните допълнителна SQL заявка за всяка итерация на цикъла.

    Но изпълнението на нова заявка за всяка итерация на цикъла на външния набор от резултати не е ефективно. Това е добър начин да убиете производителността на вашето приложение.

    Някои хора наричат ​​това N+1 избира проблем защото изпълнявате първия избор, който връща N реда и след това изпълнявате N селекти въз основа на резултатите от първия избор.

  • Ако използвате MySQL, използвайте PDO::MYSQL_ATTR_USE_BUFFERED_QUERY който по същество прави същото, изтегля всички редове, записани в масив вътрешно. След това следващи извиквания на fetch() просто повторете буферираните резултати.

    Но това включва и антимодел N+1 Selects.

  • По-добре е да напишете една единствена SQL заявка, която да ви даде желаните от вас стойности. Познавайки от вашите коментари, искате категории и броя на свързаните редове от друга таблица, където категория_id съвпада. Ето пример за такава SQL заявка:

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

Съединенията са основна част от SQL. Ако се опитате да използвате SQL, без да се научите да използвате съединения, това е като да използвате PHP, без да се научите да използвате while цикли.

Започнете от тук:Визуално обяснение на SQL присъединява .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL last_insert_id() и едновременност

  2. Изходно маскиране на MySQL (т.е. телефонен номер, SSN и т.н. форматиране на дисплея)

  3. Попълване на HTML/PHP падащо меню въз основа на първата селекция от падащо меню

  4. Импортиране от и експортиране във файлове с помощта на командния ред на MySQL

  5. Трябва ли връзката към базата данни да остане отворена през цялото време или да се отваря само когато е необходимо?