sql >> Databasteknik >  >> RDS >> Mysql

MySQL beställ efter före grupp efter

Använder en ORDER BY i en underfråga är inte den bästa lösningen på detta problem.

Den bästa lösningen för att få max(post_date) av författaren är att använda en underfråga för att returnera maxdatumet och sedan lägga till det i din tabell på både post_author och maxdatum.

Lösningen bör vara:

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

Om du har följande exempeldata:

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

Underfrågan kommer att returnera maxdatum och författare till:

MaxPostDate | Author
2/1/2013    | Jim

Sedan, eftersom du förenar det tillbaka till tabellen, kommer du att returnera alla detaljer för det inlägget för båda värdena.

Se SQL-fiol med demo .

För att utöka mina kommentarer om att använda en underfråga för att korrekt returnera denna data.

MySQL tvingar dig inte att GROUP BY varje kolumn som du inkluderar i SELECT lista. Som ett resultat, om du bara GROUP BY en kolumn men returnerar 10 kolumner totalt, det finns ingen garanti för att de andra kolumnvärdena som tillhör post_author som returneras. Om kolumnen inte är i en GROUP BY MySQL väljer vilket värde som ska returneras.

Att använda underfrågan med aggregatfunktionen garanterar att rätt författare och inlägg returneras varje gång.

Som en sidoanteckning, medan MySQL låter dig använda en ORDER BY i en underfråga och låter dig tillämpa en GROUP BY till inte varje kolumn i SELECT lista detta beteende är inte tillåtet i andra databaser inklusive SQL Server.



  1. Varför kan jag inte använda ett alias i en DELETE-sats?

  2. Vad är skillnaden mellan att använda INDEX vs KEY i MySQL?

  3. SQL Server 2016:Skapa en vy

  4. Skapa ett Docker Swarm Cluster på Azure Container Service