Използване на ORDER BY
в подзаявка не е най-доброто решение на този проблем.
Най-доброто решение за получаване на max(post_date)
от автор е да използвате подзаявка, за да върнете максималната дата и след това да я присъедините към вашата таблица и в post_author
и максималната дата.
Решението трябва да бъде:
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
Ако имате следните примерни данни:
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')
;
Подзаявката ще върне максималната дата и автора на:
MaxPostDate | Author
2/1/2013 | Jim
След това, тъй като го присъединявате обратно към таблицата, и за двете стойности ще върнете пълните подробности за тази публикация.
Вижте SQL Fiddle с демонстрация .
За да разширя коментарите си относно използването на подзаявка за точно връщане на тези данни.
MySQL не ви принуждава да GROUP BY
всяка колона, която включвате в SELECT
списък. В резултат на това, ако само GROUP BY
една колона, но връща общо 10 колони, няма гаранция, че стойностите на другите колони, които принадлежат на post_author
което се връща. Ако колоната не е в GROUP BY
MySQL избира каква стойност трябва да бъде върната.
Използването на подзаявката с агрегатната функция ще гарантира, че точният автор и публикация се връщат всеки път.
Като странична забележка, докато MySQL ви позволява да използвате ORDER BY
в подзаявка и ви позволява да приложите GROUP BY
до не всяка колона в SELECT
списък това поведение не е разрешено в други бази данни, включително SQL Server.