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

MySQL MIN / MAX trả về giá trị thích hợp, nhưng không trả về thông tin bản ghi liên quan

Bạn đã trở thành con mồi của các quy tắc lỏng lẻo của MySQL cho phép đưa các tập hợp không vào truy vấn GROUP BY. Chắc chắn, bạn đang làm việc với MIN hoặc MAX và chỉ MỘT tại một thời điểm, nhưng hãy xem xét truy vấn này:

SELECT 
    CONCAT(work_type, work_id) AS condition_id, 
    status,
    MIN(created_timestamp) as earliest,
    MAX(created_timestamp) as latest
  FROM conditions
  GROUP BY condition_id

Bây giờ, hãy nghĩ về hàng nào cột trạng thái sẽ đến từ đâu. Thật vô lý khi đặt mối tương quan giữa cột tổng hợp (những cột trong GROUP BY) và cột không tổng hợp.

Thay vào đó, hãy viết truy vấn của bạn như thế này

SELECT X.condition_id, C.status, X.earliest
FROM (
  SELECT 
    CONCAT(work_type, work_id) AS condition_id, 
    status,
    MIN(created_timestamp) as earliest
  FROM conditions
  GROUP BY condition_id
) X JOIN conditions C
  on CONCAT(c.work_type, c.work_id) = X.condition_id
  and c.created_timestamp = X.earliest

Nhưng nếu bạn có hai bản ghi với cùng một create_timestamp, nó thậm chí còn phức tạp hơn

SELECT X.condition_id, Max(C.status) status, X.earliest
FROM (
  SELECT 
    CONCAT(work_type, work_id) AS condition_id, 
    status,
    MIN(created_timestamp) as earliest
  FROM conditions
  GROUP BY condition_id
) X JOIN conditions C
  on CONCAT(c.work_type, c.work_id) = X.condition_id
  and c.created_timestamp = X.earliest
GROUP BY X.condition_id, X.earliest


  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ặp lại các sự kiện lịch và một số phép toán cuối cùng

  2. Trợ giúp về MySQL:Cách tìm tất cả các đơn đặt hàng từ khách hàng cho đến khi giá <=20 và trạng thái ='chưa thanh toán'

  3. MySQL Injection - Sử dụng truy vấn CHỌN để CẬP NHẬT / XÓA

  4. Ngoại lệ khi cố gắng chạy chương trình java từ maven

  5. Mẹo nhanh về MySQL:Sử dụng lệnh DROP USER