Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để thực hiện một truy vấn mysql PDO thứ hai trong một vòng lặp while từ một truy vấn khác?

Đây không phải là hạn chế của PDO, mà là hạn chế của thư viện máy khách MySQL. MySQL chỉ hỗ trợ một truy vấn đang thực hiện tại một thời điểm. Bạn không thể thực hiện một truy vấn khác trong khi truy vấn đầu tiên vẫn có con trỏ đang mở (tức là nó vẫn có kết quả để trả về).

Bạn có các tùy chọn sau:

  • Sử dụng PDOStatement ::fetchAll () và thu thập toàn bộ tập kết quả của truy vấn bên ngoài trong một mảng PHP. Điều này kết thúc kết quả truy vấn của truy vấn bên ngoài. Sau đó, bạn có thể lặp qua mảng và chạy một truy vấn SQL bổ sung cho mỗi lần lặp vòng lặp.

    Nhưng chạy một truy vấn mới cho mỗi lần lặp vòng lặp của tập kết quả bên ngoài không hiệu quả. Đó là một cách tốt để giết chết hiệu suất của ứng dụng của bạn.

    Một số người gọi đây là Vấn đề lựa chọn N + 1 bởi vì bạn chạy lựa chọn đầu tiên, trả về N hàng, sau đó bạn chạy N lựa chọn dựa trên kết quả của lựa chọn đầu tiên.

  • Nếu bạn sử dụng MySQL, hãy sử dụng PDO ::MYSQL_ATTR_USE_BUFFERED_QUERY về cơ bản thực hiện điều tương tự, tải xuống tất cả các hàng, được lưu trong một mảng trong nội bộ. Sau đó, các cuộc gọi tiếp theo tới fetch() chỉ cần lặp lại các kết quả được lưu vào bộ đệm.

    Nhưng điều này cũng liên quan đến phản vật chất N + 1 Selects.

  • Tốt hơn là viết một truy vấn SQL duy nhất để bạn nhận được các giá trị bạn muốn. Đoán từ nhận xét của bạn, bạn muốn các danh mục và số lượng các hàng có liên quan từ một bảng khác có category_id khớp. Đây là một ví dụ về truy vấn SQL như vậy:

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

Tham gia là một phần cơ bản của SQL. Nếu bạn cố gắng sử dụng SQL mà không học cách sử dụng các phép nối, điều này giống như sử dụng PHP mà không học cách sử dụng while vòng lặp.

Bắt đầu tại đây: Giải thích trực quan về Tham gia 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. Tạo tập lệnh đăng nhập an toàn trong PHP và MySQL mà không cần HTTPS

  2. Hàm EXP () MySQL - Trả lại e Đã tăng lên sức mạnh của x

  3. Cách kiểm tra xem mysqli_query có xóa bất kỳ hàng nào không

  4. câu hỏi cơ sở dữ liệu trong sql

  5. Giới hạn quyền truy cập hàng ngày