2011-02-10 12 views
5

Necesito recuperar las últimas filas con un valor único de mi tabla mysql. El diseño de tabla simple es la marca de tiempo (ahora()) y una columna de nombre de usuario. La tabla obtiene datos nuevos un par de veces por segundo, y necesito la última fila donde el nombre de usuario es único.MYSQL Query: última marca de tiempo + valor único de los últimos 30 minutos

SELECT MAX(timestamp) as timestamp, username 
    FROM bla 
    WHERE timestamp < (now() - interval 30 minute) 
    GROUP BY username 
    ORDER BY timestamp DESC 

Parece que esta consulta no devuelve los valores más recientes, probablemente debido a que el grupo está haciendo algo que no quiero ...

+0

Así que básicamente desea que la fila más reciente para cada usuario que se insertó en los últimos 30 minutos? Además, tenga en cuenta que 'timestamp' es una palabra reservada dentro de mysql. Debería usar un nombre diferente para el campo, o "escapándolo" con palos. –

+0

Sí, tiene razón, mi columna usa otro nombre para el valor de la marca de tiempo, esto fue solo un ejemplo :) ¡gracias por la sugerencia de todos modos! – HyperDevil

Respuesta

2
SELECT MAX(timestamp) as timestamp, username 
    FROM bla 
    WHERE timestamp > (now() - interval 30 minute) 
    GROUP BY username 
    ORDER BY timestamp DESC 
6

Si usted está tratando de mirar en los últimos 30 minutos, a continuación, Creo que quieres usar "más que" en lugar de "menos que".

... WHERE timestamp > (now() - interval 30 minute) ... 
+0

+1 Estaba a punto de hacer clic en Enviar. Bien, escribes más rápido. ;-) –

+0

Vaya, sí, lo vi, pero el resultado todavía no muestra los últimos valores. – HyperDevil

+0

@HyperDevil: si las filas se insertan a una velocidad de 2/segundo, probablemente sea difícil validar los resultados de la consulta con los datos en tiempo real. –

3

Mientras que lo que escribió hace el trabajo, una solución más rápida podría ser el uso de un LEFT JOIN en la base de datos que estoy trabajando LEFT JOIN es en realidad dos veces más rápido w/la ventaja añadida de que usted consigue todas las columnas de las filas más recientes si quieren esa información:

SELECT * 
    FROM `bla` 
    WHERE bla.created_at > (now() - interval 30 minute) AND (next_bla.created_at IS NULL) 
    LEFT JOIN bla next_bla ON bla.username = next_bla.username AND bla.created_at < next_bla.created_at 
    ORDER BY bla.created_at DESC 

esto coincide con cada fila de bla w/la siguiente fila por fecha y hora w/el mismo nombre de usuario y recoge las filas que no tienen un lado row (next_bla.created_at IS NULL) es decir, son las filas más recientes.

También puede usar una cláusula LIMIT para mejorar el rendimiento.

Este es un buen artículo que explica cómo GROUP BY obras en detalle y lenguaje claro: http://dev.mysql.com/tech-resources/articles/debunking-group-by-myths.html

Otra respuesta similar por parte Andomar - MySQL "Group By" and "Order By"

0

SELECT MAX(timestamp) as timestamp, username 
    FROM bla 
    WHERE timestamp > date_sub(now(), interval 30 minute) 
    GROUP BY username 
    ORDER BY timestamp DESC 
Cuestiones relacionadas