sql >> Databáze >  >> RDS >> Mysql

MySQL Objednávka před Seskupit podle

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

UPRAVIT:

Po několika komentářích jsem se rozhodl přidat nějaké další informace.

Společnost, ve které pracuji, také používá Postgres a zejména SQL Server. Tyto databáze takové dotazy neumožňují. Takže vím, že existuje jiný způsob, jak to udělat (níže píšu řešení). Měli byste také vědět, co dělat, pokud neseskupujete podle všech sloupců ošetřených v projekci nebo nepoužíváte agregační funkce. Jinak to nech být!

Zvolil jsem řešení výše, protože je to specifická otázka. Tom chce získat nejnovější příspěvek pro každého autora na webu wordpress. Podle mého názoru je pro analýzu zanedbatelné, když autor udělá více než jeden příspěvek za sekundu. Wordpress by to měl dokonce zakázat svou detekcí spamu-double-post. Z osobní zkušenosti vím, že při práci s tak špinavou skupinou pomocí MySQL je opravdu významný přínos ve výkonu. Ale pokud víte, co děláte, pak to dokážete! Mám takové špinavé skupiny v aplikacích, za které jsem profesionálně zodpovědný. Zde mám tabulky s několika mio řádky, které potřebují 5-15 s místo 100++ sekund.

Může být užitečné ohledně některých výhod a nevýhod: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

Ale pokud je zde více než jeden příspěvek za sekundu pro autora, dostanete více než jeden řádek a ne jediný poslední .

Nyní můžete znovu roztočit kolo a získat příspěvek s nejvyšším Id . Ani zde není alespoň zaručeno, že skutečně dostanete poslední.



  1. postgresql - nahradí všechny výskyty řetězce v textovém poli

  2. Úvod do západek

  3. Kontrola, zda položka neexistuje v jiné tabulce

  4. Rady k výkonu SQL Server od Brenta Ozara a Pinala Davea