2012-02-25 79 views
6

Tengo un sitio de redes sociales y estoy luchando con una consulta. Tengo una tabla de publicaciones que contiene todas las publicaciones de los usuarios y luego una tabla de post_comments que contiene todos los comentarios en una publicación. Estoy tratando de encontrar el último comentario por correo de la tabla post_comments. La tabla post_comments tiene las siguientes columnas:MySQL recuperar el último registro para el grupo

post_comment_id, post_id, writer_user_id, post_comment_content, fecha y hora

He agrupado los resultados por post_id así:

SELECT * FROM post_comments GROUP BY post_id 

Esto casi hace lo Quiero pero siempre devuelve el comentario más antiguo para cada publicación, no la más reciente. ¿Cómo puedo obtener el último comentario para cada publicación?

+0

La respuesta de @alexis es la mejor ... debe marcarla como aceptada, por lo que esta pregunta no aparece en la lista "no respondida". –

Respuesta

-3

¡Ordenado! Lo hice así:

SELECT * FROM (
    SELECT * FROM post_comments ORDER BY datetime DESC 
) AS post_comments 
GROUP BY post_id 
16

GROUP BY está destinado a ser utilizado con la agregación de funciones, de lo contrario, selecciona arbitrariamente una fila por cada grupo. Su solución (arriba y en su respuesta automática) funciona porque MySQL parece mantener la primera fila de cada grupo, pero no está garantizado que esto siempre suceda.

Puede obtener la fecha del último comentario para cada post_id de esta manera.

select post_id, MAX(datetime) as latest from post_comments group by post_id 

Se usa para seleccionar el último comentario:

SELECT t1.* FROM post_comments AS t1 
JOIN (
    SELECT post_id, MAX(datetime) AS latest FROM post_comments GROUP BY post_id 
) AS t2 
ON t1.post_id = t2.post_id AND t1.datetime = t2.latest 
+1

Esta es una forma correcta de manejar dicha consulta. –

2

Como tantas preguntas llegan con "Quiero que la última entrada para ...", y tienen algún tiempo la fecha. Si la tabla en cuestión es de autoincremento, y la marca de fecha/hora SIEMPRE permanecerá en correlación de tiempo secuencial ... es decir: el usuario no tiene posibilidad de editar o cambiar la marca de tiempo en el registro para poner la fecha de entrada con una fecha de hace 3 semanas ... muchos seguirán tratando de obtener esa última fecha y volver a unirse a una clave no favorecida. Solo obtenga la clave de ID máxima para la publicación y utilícela ... Tendría un índice en la ID de la publicación y la clave primaria de incremento automático.

select 
     P2.* 
    from 
     (select post_id, max(post_comment_id) as LastPost 
      from post_comments 
      group by post_id) LastPerPost 
     JOIN post_comments P2 
      on LastPerPost.LastPost = P2.post_comment_id 
+0

Esto puede no funcionar en ciertos casos, como la replicación de maestro doble. –

+0

@ypercube, al no estar familiarizado con ese término, y al analizarlo, está en lo correcto y la alternativa "por fecha" sería el mejor enfoque. – DRapp

+0

No estoy seguro si existe la posibilidad de que diferentes órdenes sucedan con un servidor, si hay múltiples conexiones insertando datos. Probablemente no con las marcas de tiempo, tal vez sí con las fechas proporcionadas por las aplicaciones (que pueden no tener relojes perfectamente sincronizados). De todos modos, su respuesta es buena para un servidor (aunque posiblemente no brinde resultados 100% precisos). Si la eficiencia importa (y no podemos agregar índices adicionales en la columna de fecha y hora), esta es probablemente la mejor consulta para usar. –

Cuestiones relacionadas