Mit einem ORDER BY
in einer Unterabfrage ist nicht die beste Lösung für dieses Problem.
Die beste Lösung, um das max(post_date)
zu erhalten by author besteht darin, eine Unterabfrage zu verwenden, um das maximale Datum zurückzugeben, und diese dann mit Ihrer Tabelle sowohl für den post_author
zu verknüpfen und das maximale Datum.
Die Lösung sollte lauten:
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
Wenn Sie die folgenden Beispieldaten haben:
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')
;
Die Unterabfrage wird das maximale Datum und den Autor von:
zurückgebenMaxPostDate | Author
2/1/2013 | Jim
Da Sie das dann wieder mit der Tabelle verbinden, werden Sie für beide Werte die vollständigen Details dieses Beitrags zurückgeben.
Siehe SQL Fiddle mit Demo .
Um meine Kommentare zur Verwendung einer Unterabfrage zur genauen Rückgabe dieser Daten zu erweitern.
MySQL zwingt Sie nicht zu GROUP BY
jede Spalte, die Sie in SELECT
einschließen aufführen. Wenn Sie also nur GROUP BY
verwenden eine Spalte, aber insgesamt 10 Spalten zurückgeben, gibt es keine Garantie dafür, dass die anderen Spaltenwerte, die zum post_author
gehören das wird zurückgegeben. Wenn sich die Spalte nicht in einem GROUP BY
befindet MySQL wählt aus, welcher Wert zurückgegeben werden soll.
Die Verwendung der Unterabfrage mit der Aggregatfunktion garantiert, dass jedes Mal der richtige Autor und Beitrag zurückgegeben wird.
Nebenbei bemerkt, während MySQL Ihnen erlaubt, einen ORDER BY
zu verwenden in einer Unterabfrage und erlaubt Ihnen, ein GROUP BY
anzuwenden zu nicht jeder Spalte im SELECT
listen Sie auf, dass dieses Verhalten in anderen Datenbanken, einschließlich SQL Server, nicht zulässig ist.