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

Nhận các bản ghi có giá trị tối đa cho từng nhóm kết quả SQL được nhóm lại

Giải pháp chính xác là:

SELECT o.*
FROM `Persons` o                    # 'o' from 'oldest person in group'
  LEFT JOIN `Persons` b             # 'b' from 'bigger age'
      ON o.Group = b.Group AND o.Age < b.Age
WHERE b.Age is NULL                 # bigger age not found

Cách hoạt động:

Nó khớp với từng hàng từ o với tất cả các hàng từ b có cùng giá trị trong cột Group và giá trị lớn hơn trong cột Age . Bất kỳ hàng nào từ o không có giá trị lớn nhất của nhóm trong cột Age sẽ khớp với một hoặc nhiều hàng từ b .

LEFT JOIN làm cho nó khớp với người lớn tuổi nhất trong nhóm (bao gồm cả những người ở một mình trong nhóm của họ) với một hàng đầy NULL s từ b ('không có độ tuổi lớn nhất trong nhóm').
Sử dụng INNER JOIN làm cho các hàng này không khớp và chúng bị bỏ qua.

WHERE mệnh đề chỉ giữ các hàng có NULL s trong các trường được trích xuất từ ​​b . Họ là những người lớn tuổi nhất trong mỗi nhóm.

Các bài đọc thêm

Giải pháp này và nhiều giải pháp khác được giải thích trong cuốn sách Phản văn bản SQL:Tránh cạm bẫy của lập trình cơ sở dữ liệu



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để chia đầu ra từ mysqldump thành các tệp nhỏ hơn?

  2. Tạo một chỉ mục trên một bảng sản xuất MySQL khổng lồ mà không cần khóa bảng

  3. Giới thiệu về chuyển đổi dự phòng cho MySQL Replication - Blog 101

  4. Thay đổi hoặc đặt Giá trị thời gian truy vấn dài MySQL cho các truy vấn chậm nhật ký

  5. (mysql, php) Làm cách nào để lấy giá trị trường auto_increment trước khi chèn dữ liệu?