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

CHỌN truy vấn phụ với điều kiện WHERE trong Yii2 find () / QueryBuilder

Truy vấn ví dụ, từ góc độ SQL đang sử dụng "truy vấn con tương quan" bên trong mệnh đề select và thường thì đây là một cách tạo truy vấn rất kém hiệu quả.

SELECT ParentTable.*, (SELECT MAX(ChildTable.NumberField) 
                       FROM ChildTable
                       WHERE ChildTable.FK_Id = ParentTable.Id)
FROM ParentTable

Mặc dù thoạt nhìn nó có vẻ phức tạp hơn và do đó kém hiệu quả hơn, nhưng nói chung tốt hơn cho hiệu suất là tránh "truy vấn con tương quan" trong mệnh đề chọn và thay thế bằng "bảng dẫn xuất" thay thế, như sau:

SELECT ParentTable.*,c.MxNum
FROM ParentTable
LEFT JOIN (
           SELECT ChildTable.FK_Id, MAX(ChildTable.NumberField) as MxNum FROM ChildTable
           GROUP BY ChildTable.FK_Id
           ) AS c ON c.FK_Id = ParentTable.Id

Lưu ý, một truy vấn con tương quan với mệnh đề select có thể trả về NULL và do đó, nếu thay thế chúng bằng một bảng dẫn xuất, loại kết nối tương đương là LEFT OUTER JOIN (hoặc đơn giản là LEFT JOIN) vì điều này cũng cho phép kết quả NULL. Tuy nhiên, nếu bạn không cần NULL cho cột, thì hãy sử dụng INNER JOIN hiệu quả hơn.

Xin lỗi trước vì không biết cú pháp Yii2, nhưng có vẻ phù hợp nếu biết một phương pháp thay thế hiệu quả có thể hỗ trợ giải quyết vấn đề.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thiết kế cơ sở dữ liệu:Khóa tổng hợp so với khóa chính một cột

  2. Bất kỳ lệnh nào trong mysql tương đương với autotrace của Oracle để chuyển hiệu suất

  3. mysqldump trên máy chủ từ xa

  4. Làm cách nào để nhập tệp excel vào MySQL Workbench?

  5. Cách tốt nhất để lưu trữ giá trị được mã hóa base64 trong MySQL DB?