Como posso obter todas as n linhas no MySQL?

9

Eu tenho uma tabela que contém dados registrados a cada minuto, então eu tenho uma linha para cada minuto. Ao devolver os dados para processamento, esta precisão é necessária para as últimas 6 horas, mas depois disso, um nível mais baixo de precisão é suficiente, por ex. a cada 5 minutos.

Eu posso retornar todos os dados em uma matriz e então remover todos os 5 elementos, mas isso requer que todos os dados sejam retornados pelo MySQL e depois lidos no array primeiro - muitos dados.

Como posso retornar a cada enésima linha no MySQL? Li esta esta postagem no blog que sugere o uso de primaryKey% 5 = 0 onde primaryKey é auto_increment mas isso

a) não usa índices b) retornará somente valores de primaryKey que são divisíveis por 5 e, no caso de exclusões, pode não ser, na verdade, toda 5ª linha

Isso pode ser feito apenas dentro da consulta SQL ou exigirá um loop de linha a linha através do conjunto de resultados usando cursores?

Estou usando o MySQLi no PHP para conectar ao DB.

    
por DavidM 02.02.2009 в 11:49
fonte

2 respostas

3

A lista de carimbos de data e hora 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 uma sub-seleção para obter as entradas de log solicitadas unindo logtimestamps to first_of_five_minutes no. É claro que outras WHERE de cláusulas precisam ser replicadas dentro e fora para que você obtenha os timestamps "certos".

Além disso, observe que isso retorna o primeiro registro de data e hora em cada intervalo de cinco minutos, em que as soluções diretamente usando minutes%5 = 0 retornam somente log-logias que são realmente em múltiplos de: 05, que podem falhar se houver atrasos na gravação de registros ou semelhantes .

    
por David Schmitt 02.02.2009 / 12:07
fonte
0

completamente não testado, mas isso pode funcionar

SELECT Row, col_a 
FROM (SELECT @row := @row + 1 AS Row, col1 AS col_a FROM table1) As derived1 
WHERE Row%5 = 0; 
    
por Learning 02.02.2009 / 11:57
fonte