Korzystanie z ORDER BY
w podzapytaniu nie jest najlepszym rozwiązaniem tego problemu.
Najlepsze rozwiązanie, aby uzyskać max(post_date)
przez autora jest użycie podzapytania do zwrócenia maksymalnej daty, a następnie dołączenie jej do tabeli na obu post_author
i maksymalną datę.
Rozwiązaniem powinno być:
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
Jeśli masz następujące przykładowe dane:
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')
;
Podzapytanie zwróci maksymalną datę i autora:
MaxPostDate | Author
2/1/2013 | Jim
Następnie, ponieważ dołączasz do tego z powrotem do tabeli, dla obu wartości zwrócisz pełne szczegóły tego postu.
Zobacz SQL Fiddle z wersją demonstracyjną .
Aby rozwinąć moje uwagi dotyczące używania podzapytania do dokładnego zwracania tych danych.
MySQL nie zmusza cię do GROUP BY
każdą kolumnę, którą uwzględnisz w SELECT
lista. W rezultacie, jeśli tylko GROUP BY
jedna kolumna, ale zwraca łącznie 10 kolumn, nie ma gwarancji, że inne wartości kolumn należą do post_author
który jest zwracany. Jeśli kolumna nie znajduje się w GROUP BY
MySQL wybiera, jaka wartość powinna zostać zwrócona.
Użycie podzapytania z funkcją agregującą zagwarantuje, że za każdym razem zostanie zwrócony prawidłowy autor i post.
Na marginesie, podczas gdy MySQL pozwala na użycie ORDER BY
w podzapytaniu i pozwala zastosować GROUP BY
do nie każdej kolumny w SELECT
wymień to zachowanie jest niedozwolone w innych bazach danych, w tym w SQL Server.