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

ORDER BY Subquery untuk konversi GROUP BY ke JOIN

Ini dapat disederhanakan menjadi yang berikut (ORDER BY di subquery tidak berguna):

SELECT * 
FROM table
GROUP BY title

Mengapa menurut Anda Anda perlu JOIN ? (Oke, ini diselesaikan dengan komentar).

Setelah komentar Anda yang Anda butuhkan untuk setiap judul, baris dengan stempel waktu terbesar, ini akan berhasil:

SELECT t.* 
FROM
    table AS t
  JOIN
    ( SELECT title
           , MAX(timestamp) AS maxts
      FROM table
      GROUP BY title
    ) AS grp
    ON grp.title = t.title
    AND grp.maxts = t.timestamp
ORDER BY t.timestamp DESC

Sebagai catatan, kueri asli Anda:

SELECT * 
FROM 
  ( SELECT * 
    FROM table 
    ORDER BY timestamp DESC 
  ) m
GROUP BY title

mungkin bekerja seperti yang diharapkan, tetapi:hanya di MySQL yang memungkinkan Anda untuk menggunakan SELECT daftar bidang yang tidak ada dalam GROUP BY klausa (atau bergantung pada itu), tanpa fungsi agregat di dalamnya. Jadi, kueri di atas akan mengembalikan kurang lebih acak baris untuk setiap judul. Bahkan, itu akan mengembalikan baris pertama yang akan ditemukannya untuk sebuah judul. Jadi, pertama-tama jalankan subquery (yang dipesan dengan timestamp DESC ) menghasilkan pencarian baris pertama dengan stempel waktu terbesar.

Namun, ini hanya terjadi karena (bila, jika) pengoptimal tidak memahami bahwa subquery tidak berguna. Anda mungkin menemukan bahwa kueri asli Anda berjalan dengan baik ketika suatu hari Anda meningkatkan ke versi MySQL 7.5 dan kueri Anda berhenti berfungsi seperti sebelumnya. (karena pengoptimal menjadi lebih pintar dan menerjemahkan kueri Anda menjadi lebih sederhana tanpa sub-pilihan).

Anda bahkan mungkin menemukan kueri Anda berhenti bekerja sama sekali dan menghasilkan kesalahan jika MySQL memutuskan dalam rilis mendatang sesuai dengan standar SQL untuk GROUP BY pertanyaan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masalah UTF-8 PHP/MySQL

  2. MyCLI – Klien MySQL/MariaDB dengan Pelengkapan Otomatis dan Penyorotan Sintaks

  3. Query Mysql GROUP by dan ORDER by

  4. Fungsi MySQL ASIN() – Mengembalikan Arc Sinus dari Angka

  5. masukkan kecepatan di mysql vs cassandra