Sử dụng ORDER BY
trong một truy vấn con không phải là giải pháp tốt nhất cho vấn đề này.
Giải pháp tốt nhất để có được max(post_date)
của tác giả là sử dụng một truy vấn con để trả về ngày tối đa và sau đó nối ngày đó vào bảng của bạn trên cả post_author
và ngày tối đa.
Giải pháp nên là:
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
Nếu bạn có dữ liệu mẫu sau:
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')
;
Truy vấn con sẽ trả về ngày tối đa và tác giả của:
MaxPostDate | Author
2/1/2013 | Jim
Sau đó, vì bạn đang tham gia đó trở lại bảng, trên cả hai giá trị, bạn sẽ trả lại toàn bộ chi tiết của bài đăng đó.
Xem SQL Fiddle with Demo .
Để mở rộng nhận xét của tôi về việc sử dụng truy vấn con để trả về chính xác dữ liệu này.
MySQL không buộc bạn phải GROUP BY
mọi cột mà bạn đưa vào SELECT
danh sách. Do đó, nếu bạn chỉ GROUP BY
một cột nhưng trả về tổng cộng 10 cột, không có gì đảm bảo rằng các giá trị cột khác thuộc về post_author
được trả lại. Nếu cột không nằm trong GROUP BY
MySQL chọn giá trị nào sẽ được trả về.
Sử dụng truy vấn con với chức năng tổng hợp sẽ đảm bảo rằng tác giả và bài đăng chính xác được trả lại mọi lúc.
Lưu ý thêm, trong khi MySQL cho phép bạn sử dụng ORDER BY
trong một truy vấn con và cho phép bạn áp dụng GROUP BY
không phải mọi cột trong SELECT
liệt kê hành vi này không được phép trong các cơ sở dữ liệu khác bao gồm SQL Server.