2012-07-05 23 views
7

Tengo una tabla que contiene los comentarios del usuario y quiero recuperar el último comentario hecho por cada usuario.obteniendo datos de una relación muchos a muchos db

Consulta a continuación u debe dar una idea de lo que estoy tratando de hacer

select comment, comment_id, userId FROM comments_table 
WHERE comment_id in (
    SELECT MAX(comment_id) 
    FROM comments_table where userId in (2001, 2002, 2010) 
    GROUP BY userId 
) 

Por encima de las obras de consulta, pero lleva demasiado tiempo, especialmente si hay muchos userIds.

Necesito una declaración de consulta más rápida que logre lo mismo.

Respuesta

9

Utilice una unión en lugar de una subconsulta:

SELECT 
    b.* 
FROM 
    (
     SELECT userid, MAX(comment_id) AS maxcomment 
     FROM comments_table 
     WHERE userid IN (2001, 2002, 2010) 
     GROUP BY userid 
    ) a 
INNER JOIN 
    comments_table b ON 
     a.userid = b.userid AND 
     a.maxcomment = b.comment_id 

El sub-select únicamente en esta consulta se ejecutará una vez, en lugar de una subconsulta WHERE IN que ejecutará para cada fila de la tabla comentarios.

+0

redujo el tiempo de consulta de 1seg a 0.0026. gracias – user1502826

+0

¿qué necesitaría agregar a la consulta anterior si hay otra tabla llamada user_details como u que también quiero extraer columnas u.mainimage y u.fullname tal vez usando b.user_id = u.user_id – user1502826

+0

¿Qué tabla sería 'user_details' conectar el enlace a? La tabla de comentarios? Tabla de usuarios? –

0

Pruebe con

  select comment, comment_id, userId FROM   comments_table WHERE userId in (2001, 2002, 2010) order by comment_id desc limit 1 

probar y ver si esta consulta es equivalente a la suya Con un índice en la columna de la userid, esto debería llevar a cabo más que decente

+0

Esto solo recuperará una fila: * el comentario más reciente realizado por cualquiera de los tres usuarios *. El O.P. está pidiendo el comentario más reciente hecho por *** cada *** de los tres usuarios, lo que significa que debe realizar un máximo de grupos por los comentarios realizados por cada usuario. –

0

Vamos a mantenerlo simple:

SELECT comment, MAX(comment_id), userId 
FROM comments_table 
WHERE userId IN (2001, 2002, 2010) 
GROUP BY userId; 
+0

Esta solución extraerá el 'comment_id' más reciente por' userid', pero el campo 'comment' no estará en la correspondencia correcta con' comment_id'. –

Cuestiones relacionadas