sql >> Database >  >> RDS >> Mysql

MySQL bestellen voor voor groeperen op

Een ORDER BY gebruiken in een subquery is niet de beste oplossing voor dit probleem.

De beste oplossing om de max(post_date) . te krijgen door auteur is om een ​​subquery te gebruiken om de maximale datum terug te geven en die vervolgens toe te voegen aan uw tabel op zowel de post_author en de maximale datum.

De oplossing zou moeten zijn:

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

Als u over de volgende voorbeeldgegevens beschikt:

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')
;

De subquery retourneert de maximale datum en auteur van:

MaxPostDate | Author
2/1/2013    | Jim

Aangezien je dat weer terugbrengt naar de tabel, geef je op beide waarden de volledige details van dat bericht terug.

Zie SQL Fiddle met demo .

Om uit te breiden op mijn opmerkingen over het gebruik van een subquery om deze gegevens nauwkeurig te retourneren.

MySQL dwingt je niet om GROUP BY elke kolom die u opneemt in de SELECT lijst. Als gevolg hiervan, als u alleen GROUP BY één kolom maar retourneert in totaal 10 kolommen, er is geen garantie dat de andere kolomwaarden die behoren tot de post_author dat wordt teruggegeven. Als de kolom niet in een GROUP BY staat MySQL kiest welke waarde moet worden geretourneerd.

Het gebruik van de subquery met de aggregatiefunctie garandeert dat de juiste auteur en het juiste bericht elke keer wordt geretourneerd.

Even terzijde, terwijl u met MySQL een ORDER BY . kunt gebruiken in een subquery en stelt u in staat om een ​​GROUP BY . toe te passen naar niet elke kolom in de SELECT lijst dit gedrag is niet toegestaan ​​in andere databases, inclusief SQL Server.



  1. Hoe een Auto Increment Primary Key in Oracle te definiëren

  2. SQLite-datum en tijd

  3. room error:de kolommen die door de query worden geretourneerd, hebben niet de velden fieldname

  4. Toegang krijgen tot de tabel van een andere gebruiker binnen een Oracle Stored Procedure