Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Reihenfolge vor Gruppieren nach

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

BEARBEITEN:

Nach einigen Kommentaren habe ich mich entschlossen, einige zusätzliche Informationen hinzuzufügen.

Die Firma, in der ich arbeite, verwendet auch Postgres und insbesondere SQL Server. Diese Datenbanken erlauben solche Abfragen nicht. Ich weiß also, dass es einen anderen Weg gibt (ich schreibe unten eine Lösung). Sie sollten auch wissen, was Sie tun, wenn Sie nicht nach allen in der Projektion behandelten Spalten gruppieren oder Aggregatfunktionen verwenden. Ansonsten lass es sein!

Ich habe die Lösung oben gewählt, weil es eine spezifische Frage ist. Tom möchte den neuesten Beitrag für jeden Autor auf einer WordPress-Site erhalten. Meiner Meinung nach ist es für die Analyse vernachlässigbar, wenn ein Autor mehr als einen Beitrag pro Sekunde schreibt. Wordpress sollte es sogar durch seine Spam-Doppelpost-Erkennung verbieten. Ich weiß aus persönlicher Erfahrung, dass es einen wirklich erheblichen Leistungsvorteil gibt, wenn man eine solche schmutzige Gruppe mit MySQL durchführt. Aber wenn du weißt, was du tust, dann kannst du es auch! Ich habe solche schmutzigen Gruppen in Apps, für die ich beruflich verantwortlich bin. Hier habe ich Tabellen mit einigen Millionen Zeilen, die statt 100++ Sekunden 5-15 Sekunden brauchen.

Kann bezüglich einiger Vor- und Nachteile nützlich sein: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

Aber wenn hier mehr als ein Beitrag pro Sekunde für einen Autor ist, bekommst du mehr als eine Zeile und nicht die einzige letzte .

Jetzt können Sie das Rad erneut drehen und erhalten den Beitrag mit der höchsten Id . Auch hier ist zumindest nicht garantiert, dass man wirklich den letzten bekommt.