Menggunakan ORDER BY
dalam subquery bukanlah solusi terbaik untuk masalah ini.
Solusi terbaik untuk mendapatkan max(post_date)
oleh penulis adalah menggunakan subkueri untuk mengembalikan tanggal maksimum dan kemudian menggabungkannya ke tabel Anda di post_author
dan tanggal maksimal.
Solusinya seharusnya:
SELECT p1.*
FROM wp_posts p1
INNER JOIN
(
SELECT max(post_date) MaxPostDate, post_author
FROM wp_posts
WHERE post_status='publish'
AND post_type='post'
GROUP BY post_author
) p2
ON p1.post_author = p2.post_author
AND p1.post_date = p2.MaxPostDate
WHERE p1.post_status='publish'
AND p1.post_type='post'
order by p1.post_date desc
Jika Anda memiliki contoh data berikut:
CREATE TABLE wp_posts
(`id` int, `title` varchar(6), `post_date` datetime, `post_author` varchar(3))
;
INSERT INTO wp_posts
(`id`, `title`, `post_date`, `post_author`)
VALUES
(1, 'Title1', '2013-01-01 00:00:00', 'Jim'),
(2, 'Title2', '2013-02-01 00:00:00', 'Jim')
;
Subquery akan mengembalikan tanggal maksimum dan penulis:
MaxPostDate | Author
2/1/2013 | Jim
Kemudian karena Anda menggabungkannya kembali ke tabel, pada kedua nilai tersebut Anda akan mengembalikan detail lengkap dari pos tersebut.
Lihat SQL Fiddle dengan Demo .
Untuk memperluas komentar saya tentang menggunakan subquery untuk mengembalikan data ini secara akurat.
MySQL tidak memaksa Anda untuk GROUP BY
setiap kolom yang Anda sertakan di SELECT
daftar. Akibatnya, jika Anda hanya GROUP BY
satu kolom tetapi mengembalikan total 10 kolom, tidak ada jaminan bahwa nilai kolom lainnya milik post_author
yang dikembalikan. Jika kolom tidak dalam GROUP BY
MySQL memilih nilai apa yang harus dikembalikan.
Menggunakan subquery dengan fungsi agregat akan menjamin bahwa penulis dan posting yang benar dikembalikan setiap saat.
Sebagai catatan tambahan, sementara MySQL memungkinkan Anda untuk menggunakan ORDER BY
dalam subquery dan memungkinkan Anda untuk menerapkan GROUP BY
untuk tidak setiap kolom di SELECT
daftar perilaku ini tidak diperbolehkan di database lain termasuk SQL Server.