Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL MIN/MAX mengembalikan nilai yang tepat, tetapi bukan info catatan terkait

Anda telah menjadi mangsa aturan lemah MySQL yang memungkinkan non-agregat untuk dimasukkan dalam kueri GROUP BY. Tentu, Anda bekerja dengan MIN atau MAX, dan hanya SATU sekaligus, tetapi pertimbangkan kueri ini:

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

Sekarang, pikirkan tentang baris yang mana kolom status harus berasal. Tidak masuk akal untuk menempatkan korelasi antara agregat (yang ada di GROUP BY) dan kolom non-agregat.

Sebagai gantinya, tulis kueri Anda seperti ini

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

Tetapi jika Anda memiliki dua catatan dengan stempel waktu_created yang sama, itu akan menjadi lebih rumit

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. Bagaimana saya menyimpan dan mengambil gambar di server saya di aplikasi web java

  2. Permintaan MySQL untuk teman bersama

  3. Buat kenaikan otomatis mengisi nomor yang sebelumnya dihapus

  4. Membandingkan timestamp dengan variabel tanggal (MySQL dan PHP)

  5. PDO bindValue dengan \PDO::PARAM_BOOL menyebabkan eksekusi pernyataan gagal secara diam-diam