¿Cómo puedo obtener cada n filas en MySQL?
Pregunta
Tengo una tabla que contiene datos grabados cada minuto, así que tengo una fila por cada minuto. Al devolver los datos para el procesamiento, se requiere esta precisión durante las últimas 6 horas, pero después de eso, un nivel de precisión más bajo es suficiente, p. cada 5 minutos.
Puedo devolver todos los datos en una matriz y luego eliminar todos los elementos, excepto cada quinto, pero eso requiere que MySQL devuelva todos los datos y luego leerlos primero en la matriz, una gran cantidad de datos.
¿Cómo puedo devolver cada enésima fila en MySQL? He leído esta publicación de blog que sugiere usar primaryKey% 5 = 0 donde primaryKey es auto_increment pero esto
a) no usa índices b) solo devolverá los valores de PrimaryKey que son divisibles por 5 y, en el caso de eliminaciones, puede que no sea cada 5ta fila
¿Se puede hacer esto dentro de la consulta SQL o requerirá recorrer fila por fila a través del conjunto de resultados usando cursores?
Estoy usando MySQLi en PHP para conectarme a la base de datos.
Solución
La lista de marcas de tiempo cada 5 minutos:
SELECT
MIN(logtimestamp) AS first_of_five_minutes
FROM tLog
GROUP BY
DATE(logtimestamp),
HOUR(logtimestamp),
MINUTE(logtimestamp) - (MINUTE(logtimestamp) % 5)
Ahora, puede usar esto como una sub-selección para obtener las entradas de registro solicitadas uniendo logtimestamps
a first_of_five_minutes
en el. Por supuesto, las cláusulas WHERE
adicionales deben replicarse por dentro y por fuera para que obtenga & Quot; right & Quot; marcas de tiempo.
Además, tenga en cuenta que esto devuelve la primera marca de tiempo en cada intervalo de cinco minutos, mientras que las soluciones que usan directamente minutes%5 = 0
solo devuelven logentries que en realidad están en múltiplos de: 05, que pueden fallar si tiene retrasos en la grabación de registros o similar .
Otros consejos
completamente no probado pero esto podría funcionar
SELECT Row, col_a
FROM (SELECT @row := @row + 1 AS Row, col1 AS col_a FROM table1) As derived1
WHERE Row%5 = 0;