two descendente columns asc mysql sql select sql-order-by

descendente - MySQL ordena mensajes por comentario más reciente O publicado por última vez



order by two columns mysql (1)

¿Cómo puedo ordenar las publicaciones para que la actividad más reciente esté arriba?

# Schema not including all info, including FKs CREATE TABLE post( id int unsigned primary key auto_increment, msg text, created datetime )ENGINE=InnoDb; CREATE TABLE comment( id int unsigned primary key auto_increment, post_id int unsigned, msg text, created datetime )ENGINE=InnoDb;

Deseo ordenar las publicaciones más recientes, donde una nueva publicación es obviamente más reciente que una publicación anterior, pero una publicación anterior que tiene un comentario reciente asociado califica como la más reciente.

Primer intento

# Selecting ''*'' for simplicity in this example select * from post p left join comment c on c.post_id = p.id group by p.id order by c.created desc, p.created desc

Esto no funciona porque las publicaciones nuevas se ordenan después de publicaciones antiguas con comentarios.

Segundo intento

select *, if(c.id is null, p.created, c.created) as recency from post p left join comment c on c.post_id = p.id group by p.id order by recency desc

No funciona porque si una publicación tiene más de un comentario, recencia tendrá el valor creado de la primera fila coincidente, que es el comentario más antiguo.

* ¿Hay alguna manera de agrupar por p.id (de modo que solo se selecciona una copia de cada publicación), pero la ordenación dentro de cada grupo es por c.data desc, pero la orden de consulta por es reciente? No puedo pensar en una manera de hacerlo sin posiblemente agregar un campo actualizado para publicar , en el que escribiría siempre que se publique una respuesta ...

¡Gracias!


Esto debería hacerlo:

SELECT p.id FROM post p LEFT JOIN comment c on c.post_id = p.id GROUP BY p.id ORDER BY COALESCE(GREATEST(p.created, MAX(c.created)), p.created) DESC

Si suponemos que un comentario siempre es anterior a la publicación, podemos simplificar:

SELECT p.id FROM post p LEFT JOIN comment c on c.post_id = p.id GROUP BY p.id ORDER BY COALESCE(MAX(c.created), p.created) DESC