Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak zrobić drugie zapytanie mysql PDO w pętli while z innego zapytania?

To nie jest ograniczenie PDO, to ograniczenie biblioteki klienta MySQL. MySQL obsługuje tylko jedno zapytanie w toku na raz. Nie możesz wykonać innego zapytania, gdy pierwsze zapytanie nadal ma otwarty kursor (tj. nadal ma wyniki do zwrócenia).

Masz następujące opcje:

  • Użyj PDOStatement::fetchAll() i zbierz cały zestaw wyników zewnętrznego zapytania w tablicy PHP. To kończy wynik zapytania zewnętrznego. Następnie możesz zapętlić tablicę i uruchomić dodatkowe zapytanie SQL dla każdej iteracji pętli.

    Jednak uruchomienie nowego zapytania dla każdej iteracji pętli zewnętrznego zestawu wyników nie jest wydajne. To dobry sposób na obniżenie wydajności aplikacji.

    Niektórzy nazywają to Problemem wyboru N+1 ponieważ uruchamiasz pierwszy wybór, który zwraca N wierszy, a następnie uruchamiasz N wyborów na podstawie wyników pierwszego wyboru.

  • Jeśli używasz MySQL, użyj PDO::MYSQL_ATTR_USE_BUFFERED_QUERY który zasadniczo robi to samo, pobiera wszystkie wiersze zapisane w wewnętrznej tablicy. Następnie kolejne wywołania fetch() po prostu iteruj po zbuforowanych wynikach.

    Ale dotyczy to również antywzorca wyboru N+1.

  • Lepiej jest napisać pojedyncze zapytanie SQL, które daje żądane wartości. Zgadując z komentarzy, chcesz kategorii i liczby powiązanych wierszy z innej tabeli, w której pasuje identyfikator_kategorii. Oto przykład takiego zapytania 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");
    

Sprzężenia są podstawową częścią SQL. Jeśli próbujesz używać SQL bez nauki używania złączeń, to jest to jak używanie PHP bez nauki używania while pętle.

Zacznij tutaj:Wizualne wyjaśnienie Połączenia 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. Praca ze zdarzeniami w MySQL

  2. dwa klucze obce, jak mapować z laravel elokwentnym

  3. jak załadować plik danych w amazon RDS?

  4. PHP i mySQL:Kiedy dokładnie używać htmlentities?

  5. Jak używać operatora IN z JDBI?