Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Ordem MySQL antes de Agrupar por


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


EDITAR:

Após alguns comentários, decidi adicionar algumas informações adicionais.

A empresa em que estou trabalhando também usa Postgres e principalmente SQL Server. Esses bancos de dados não permitem tais consultas. Então eu sei que existe uma outra maneira de fazer isso (escrevo uma solução abaixo). Você também deve saber o que faz se não agrupar por todas as colunas tratadas na projeção ou usar funções agregadas. Caso contrário, deixe estar!

Eu escolhi a solução acima, porque é uma questão específica. Tom deseja obter a postagem recente de cada autor em um site wordpress. Na minha opinião, é insignificante para a análise se um autor fizer mais de um post por segundo. O Wordpress deve até proibi-lo por sua detecção de spam de postagem dupla. Eu sei por experiência pessoal que há um benefício realmente significativo no desempenho fazendo um grupo tão sujo com o MySQL. Mas se você sabe o que faz, então você pode fazê-lo! Eu tenho esses grupos sujos em aplicativos pelos quais sou profissionalmente responsável. Aqui eu tenho tabelas com algumas linhas mio que precisam de 5-15s em vez de 100++ segundos.

Pode ser útil sobre alguns prós e contras: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

Mas se houver mais de uma postagem por segundo para um autor, você obterá mais de uma linha e não a única última .

Agora você pode girar a roleta novamente e obter a postagem com o maior Id . Mesmo aqui, pelo menos, não é garantido que você realmente obtenha o último.