sql >> Database >  >> RDS >> Mysql

MySQL Bestel voor Groeperen op

select wp_posts.* from wp_posts
where wp_posts.post_status='publish'and wp_posts.post_type='post'
group by wp_posts.post_author
having wp_posts.post_date = MAX(wp_posts.post_date) /* ONLY THE LAST POST FOR EACH AUTHOR */
order by wp_posts.post_date desc

BEWERKEN:

Na wat opmerkingen heb ik besloten om wat extra informatie toe te voegen.

Het bedrijf waar ik werk gebruikt ook Postgres en vooral SQL Server. Deze databases staan ​​dergelijke zoekopdrachten niet toe. Dus ik weet dat er een andere manier is om dit te doen (ik schrijf hieronder een oplossing). U moet ook weten wat u doet als u niet groepeert op alle kolommen die in de projectie worden behandeld of aggregatiefuncties gebruikt. Laat het anders zo zijn!

Ik heb voor bovenstaande oplossing gekozen, omdat het een specifieke vraag is. Tom wil het recente bericht voor elke auteur op een wordpress-site krijgen. Naar mijn mening is het verwaarloosbaar voor de analyse als een auteur meer dan één post per seconde doet. Wordpress zou het zelfs moeten verbieden door zijn dubbele-post detectie van spam. Ik weet uit persoonlijke ervaring dat er echt een aanzienlijk voordeel is in prestaties als je zo'n vuile groep doet met MySQL. Maar als je weet wat je doet, dan kun je het! Ik heb zulke vieze groepen in apps waar ik professioneel verantwoordelijk voor ben. Hier heb ik tabellen met een paar miljoen rijen die 5-15 seconden nodig hebben in plaats van 100++ seconden.

Kan nuttig zijn over enkele voor- en nadelen:http://ftp.nchu.edu.tw/MySQL/tech-resources/articles/debunking-group-by-myths.html

SELECT
    wp_posts.*
FROM 
    wp_posts
    JOIN 
    (
        SELECT
            g.post_author
            MAX(g.post_date) AS post_date
        FROM wp_posts as g
        WHERE
            g.post_status='publish'
            AND g.post_type='post'
        GROUP BY g.post_author
    ) as t 
    ON wp_posts.post_author = t.post_author AND wp_posts.post_date = t.post_date

ORDER BY wp_posts.post_date

Maar als hier meer dan één bericht per seconde is voor een auteur, krijg je meer dan één rij en niet de enige laatste .

Nu kun je weer aan het wiel draaien en de post met de hoogste Id krijgen . Zelfs hier is het in ieder geval niet gegarandeerd dat je echt de laatste krijgt.



  1. Geef de dag, maand en jaar terug in MySQL

  2. Anatomie van een rol bij softwareontwikkeling:gegevenswetenschapper

  3. Hoe u de dag van het jaar kunt halen uit een datum in PostgreSQL

  4. Snelste manier om geneste bulk-inserts uit te voeren met scope_identity() gebruik?