Como posso obter a cada n linhas no MySQL?
Pergunta
Eu tenho uma tabela que contém os dados gravados a cada minuto, então eu tenho uma linha para cada minuto. Ao retornar os dados para processamento, esta precisão é necessário para as últimas 6 horas, mas depois disso, um menor nível de precisão é suficiente, por exemplo, a cada 5 minutos.
Eu posso devolver todos os dados em uma matriz e, em seguida, remover todos, mas cada 5º elemento, mas que exige que todos os dados devolvido pelo MySQL e depois ler na matriz em primeiro lugar -. Bastante um monte de dados
Como posso devolver cada linha enésima no MySQL? Eu li este post que sugere o uso de % primaryKey 5 = 0, onde primaryKey é auto_increment mas isso
a) não usa índices b) só retornará valores primaryKey que são divisíveis por 5 e, no caso de eliminações, não pode realmente ser cada linha 5
Isso pode ser feito apenas dentro da consulta SQL ou vai exigir looping linha por linha através do conjunto de resultados usando cursores?
Eu estou usando MySQLi em PHP para se conectar ao DB.
Solução
A lista de marcas de tempo a cada 5 minutos:
SELECT
MIN(logtimestamp) AS first_of_five_minutes
FROM tLog
GROUP BY
DATE(logtimestamp),
HOUR(logtimestamp),
MINUTE(logtimestamp) - (MINUTE(logtimestamp) % 5)
Agora, você pode usar isso como um sub-seleccionar para obter as entradas de log solicitados juntando logtimestamps
para first_of_five_minutes
no. Claro, WHERE
-cláusulas adicionais têm de ser replicadas dentro e fora de modo a obter a data e hora "certa".
Além disso, note que este retorna o primeiro timestamp em cada intervalo de cinco minutos, wheras soluções diretamente usando minutes%5 = 0
única logentries que são realmente em múltiplos de retorno:. 05, que pode falhar se você tiver atrasos na gravação de logs ou semelhantes
Outras dicas
completamente testado, mas este trabalho poder
SELECT Row, col_a
FROM (SELECT @row := @row + 1 AS Row, col1 AS col_a FROM table1) As derived1
WHERE Row%5 = 0;