Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL sortieren nach vor gruppieren nach

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ückgeben
MaxPostDate | 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.