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

Làm cách nào để cải thiện truy vấn này để tránh sử dụng các chế độ xem lồng nhau?

Làm quen với dữ liệu bạn có:

Điều quan trọng đầu tiên là hiểu dữ liệu bạn có. Trong trường hợp này, bạn có bốn bảng

  • Bảo hiểmCác công ty
  • Bệnh nhân
  • Bác sĩ
  • Lượt truy cập

Mục tiêu của bạn:

Tìm danh sách tất cả những bệnh nhân đã đến khám với tất cả các bác sĩ chỉnh hình (chuyên khoa) có liên kết với Công ty Bảo hiểm của họ.

Hãy lùi lại một bước và phân tích nó thành những phần nhỏ hơn:

Nói chung, các yêu cầu có thể hơi áp đảo khi bạn nhìn vào tổng thể. Hãy chia các yêu cầu thành các thành phần nhỏ hơn để hiểu những gì bạn cần làm.

  1. Phần a: Bạn cần tìm danh sách các bác sĩ có chuyên môn là 'Bác sĩ chỉnh hình'
  2. Phần b: Tìm danh sách những bệnh nhân đã đến khám với các bác sĩ được xác định trong # 1.
  3. Phần c: Lọc kết quả số 2 để tìm danh sách bệnh nhân và bác sĩ có cùng công ty bảo hiểm.
  4. Phần d: Tìm hiểu xem những bệnh nhân đã đến thăm từng Bác sĩ chỉnh hình người thuộc cùng một công ty bảo hiểm với bệnh nhân.

Cách tiếp cận:

  1. Bạn cần xác định mục tiêu chính của mình, ở đây trong trường hợp này là xác định danh sách bệnh nhân. Vì vậy, hãy truy vấn bảng Bệnh nhân trước.

  2. Bạn có bệnh nhân, thực sự là tất cả họ nhưng chúng tôi cần tìm những bệnh nhân nào trong số những bệnh nhân này đã đến gặp bác sĩ. Đừng lo lắng về việc bác sĩ có phải là Bác sĩ chỉnh hình hay không. Chúng tôi chỉ cần danh sách bệnh nhân và bác sĩ mà họ đã thăm khám. Không có ánh xạ giữa bảng Bệnh nhân và Bác sĩ. Để tìm hiểu thông tin này,

    Tham gia bảng Bệnh nhân với bảng Lượt thăm trên trường khóa chính xác.

    Sau đó, kết hợp đầu ra với bảng Bác sĩ trên trường khóa chính xác.

  3. Nếu bạn đã tham gia một cách chính xác, bây giờ bạn sẽ có danh sách tất cả các bệnh nhân và bác sĩ mà họ đã thăm khám. Nếu bạn đã sử dụng LEFT OUTER JOIN , bạn sẽ tìm thấy ngay cả những bệnh nhân chưa từng đến gặp bác sĩ. Nếu bạn đã sử dụng RIGHT OUTER JOIN , bạn sẽ chỉ tìm thấy những bệnh nhân đã đến khám bác sĩ.

  4. Bây giờ, bạn có tất cả các bệnh nhân và các bác sĩ mà họ đã đến thăm. Tuy nhiên, yêu cầu là chỉ tìm bác sĩ là Bác sĩ chỉnh hình . Vì vậy, hãy áp dụng điều kiện để lọc kết quả để chỉ đưa ra kết quả mong muốn.

  5. Bây giờ bạn đã đạt được các yêu cầu khi được chia thành các thành phần nhỏ hơn trong phần a phần b . Bạn vẫn cần phải lọc nó bởi các công ty bảo hiểm. Đây là phần khó, yêu cầu không nói rằng bạn cần hiển thị công ty bảo hiểm, vì vậy chúng ta không cần phải sử dụng bảng InsuranceCompanies. Câu hỏi tiếp theo của bạn sẽ 'How am I going to filter the results?' . Điểm hợp lệ. Tìm xem có bảng nào trong ba bảng Patient không , DoctorVisits chứa thông tin công ty bảo hiểm. PatientDoctor có một lĩnh vực chung. Tham gia trường chung đó để lọc kết quả.

  6. Tìm số lượng Bác sĩ chỉnh hình duy nhất mà mỗi bệnh nhân đã đến thăm.

  7. Đây là phần có thể được thực hiện theo nhiều cách, một trong những cách làm điều này là thêm một truy vấn phụ sẽ là cột thứ tư của bạn trong đầu ra. Truy vấn phụ này sẽ truy vấn bảng Bác sĩ và lọc theo chuyên khoa ='Bác sĩ chỉnh hình'. Ngoài bộ lọc đó, bạn cũng phải lọc bằng cách đối sánh công ty bảo hiểm trên bảng bên trong với id công ty bảo hiểm trên bảng Bệnh nhân có trên truy vấn chính. Truy vấn con này sẽ trả về tổng số của tất cả các Bác sĩ chỉnh hình cho id công ty bảo hiểm khớp với dữ liệu của bệnh nhân.

  8. Bây giờ bạn sẽ có các trường patient id , patient name , patients visits counttotal number of Orthopedists in same insurance company từ truy vấn phụ. Sau đó, bạn có thể thêm một liên kết bên ngoài sẽ lọc kết quả từ bảng dẫn xuất này trên các trường mà patients visits count khớp với total number of Orthopedists in same insurance company . Tôi không nói đây là cách tiếp cận tốt nhất. Đây là một cách tiếp cận mà tôi có thể nghĩ ra.

  9. Nếu bạn tuân theo logic ở trên, bạn sẽ có điều này.

Danh sách bệnh nhân đã đến khám tất cả các bác sĩ

Được lọc bởi chỉ các bác sĩ, họ là Bác sĩ chỉnh hình

Được lọc bởi các bệnh nhân và bác sĩ chia sẻ cùng một thông tin về công ty bảo hiểm.

Một lần nữa, toàn bộ đầu ra sau đó được lọc bởi hai trường đếm được tìm thấy bên trong đầu ra của bảng dẫn xuất.

Quả bóng ở trong sân của bạn:

  • Hãy thử từng bước và khi bạn tìm thấy câu trả lời. Đăng nó ở đây như một câu trả lời riêng biệt. Tôi sẽ ủng hộ nó để bù đắp cho tất cả những phản đối mà bạn nhận được cho câu hỏi này.

Tôi tin rằng bạn có thể làm điều này một cách dễ dàng.

Nếu bạn vấp ngã ...

Đừng ngần ngại đăng câu hỏi của bạn dưới dạng comments to this answer , Những người khác và tôi sẽ rất vui khi được hỗ trợ bạn.

Tuyên bố từ chối trách nhiệm

Tôi đã cung cấp một trong nhiều cách có thể thực hiện logic này. Tôi chắc chắn rằng có nhiều cách để thực hiện điều này theo cách tốt hơn nhiều.

Kết quả:

Vui lòng tham khảo câu trả lời của @Ofek Ron để biết truy vấn chính xác tạo ra đầu ra mong muốn. Tôi đã không viết bất kỳ phần nào của truy vấn. Đó là tất cả nỗ lực của OP.



  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ại sao hai câu lệnh xóa + chèn đồng thời lại bị kẹt trên một bảng trống?

  2. Xử lý đúng cách dữ liệu dài trong Hibernate

  3. Mysql thả người dùng với tài trợ cho nhiều máy chủ

  4. Truy vấn SQL để tìm số lượng bạn bè chung cho một bảng gồm người, cặp bạn bè

  5. Đạt được thứ bậc, Mối quan hệ cha mẹ / con cái một cách hiệu quả và dễ dàng