sql >> Database teknologi >  >> RDS >> Mysql

MySQL bestil efter før gruppe efter

Brug af en ORDER BY i en underforespørgsel er ikke den bedste løsning på dette problem.

Den bedste løsning til at få max(post_date) af forfatter er at bruge en underforespørgsel til at returnere den maksimale dato og derefter tilføje den til din tabel på både post_author og maks. dato.

Løsningen bør være:

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

Hvis du har følgende eksempeldata:

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

Underforespørgslen vil returnere maks. dato og forfatter til:

MaxPostDate | Author
2/1/2013    | Jim

Da du så slutter dig tilbage til bordet, vil du på begge værdier returnere alle oplysningerne om det pågældende indlæg.

Se SQL Fiddle with Demo .

For at udvide mine kommentarer om at bruge en underforespørgsel til at returnere disse data nøjagtigt.

MySQL tvinger dig ikke til at GROUP BY hver kolonne, du inkluderer i SELECT liste. Som et resultat, hvis du kun GROUP BY én kolonne, men returnerer 10 kolonner i alt, er der ingen garanti for, at de andre kolonneværdier, der tilhører post_author der returneres. Hvis kolonnen ikke er i en GROUP BY MySQL vælger hvilken værdi der skal returneres.

Brug af underforespørgslen med aggregatfunktionen garanterer, at den korrekte forfatter og indlæg returneres hver gang.

Som en sidebemærkning, mens MySQL giver dig mulighed for at bruge en ORDER BY i en underforespørgsel og giver dig mulighed for at anvende en GROUP BY til ikke hver kolonne i SELECT liste denne adfærd er ikke tilladt i andre databaser inklusive SQL Server.



  1. Opdater en databasemailkonto i SQL Server (T-SQL)

  2. SQL Server Index Usage Stats

  3. 10 fakta om overvågning af databaseydeevne, der kan overraske dig

  4. Lagring og analyse af dokumenter på Windows filsystem med SQL Server Semantic Search – Del 2