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.

Foi útil?

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; 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top