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.