sql >> Base de Datos >  >> RDS >> Mysql

MySQL Ordenar 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:

Después de algunos comentarios, he decidido agregar información adicional.

La empresa en la que trabajo también usa Postgres y especialmente SQL Server. Estas bases de datos no permiten este tipo de consultas. Entonces sé que hay otra forma de hacer esto (escribo una solución a continuación). También debe saber qué hace si no agrupa por todas las columnas tratadas en la proyección o usa funciones agregadas. De lo contrario, ¡déjalo estar!

Elegí la solución anterior, porque es una pregunta específica. Tom quiere obtener la publicación reciente de cada autor en un sitio de wordpress. En mi opinión, es insignificante para el análisis si un autor hace más de una publicación por segundo. Wordpress debería incluso prohibirlo por su detección de correo no deseado doble. Sé por experiencia personal que hay un beneficio realmente significativo en el rendimiento haciendo un grupo tan sucio con MySQL. Pero si sabes lo que haces, ¡entonces puedes hacerlo! Tengo grupos tan sucios en aplicaciones de los que soy responsable profesionalmente. Aquí tengo tablas con algunas filas mio que necesitan de 5 a 15 segundos en lugar de 100++ segundos.

Puede ser útil sobre algunos pros y 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

Pero si aquí hay más de una publicación por segundo para un autor, obtendrá más de una fila y no la única última .

Ahora puede girar la rueda nuevamente y obtener la publicación con el Id más alto . Incluso aquí, al menos, no está garantizado que realmente obtengas el último.