Domanda

Ho una tabella che contiene i dati registrati ogni minuto, quindi ho una riga per ogni minuto. Quando si restituiscono i dati per l'elaborazione, questa precisione è richiesta per le ultime 6 ore, ma successivamente è sufficiente un livello di precisione inferiore, ad es. ogni 5 minuti.

Posso restituire tutti i dati in un array e quindi rimuovere tutti tranne ogni quinto elemento, ma ciò richiede che tutti i dati vengano restituiti da MySQL e quindi letti prima nell'array - molti dati.

Come posso restituire ogni ennesima riga in MySQL? Ho letto questo post sul blog che mi suggerisce di utilizzare primaryKey% 5 = 0 dove primaryKey è auto_increment ma questo

a) non usa gli indici b) restituirà solo i valori di chiave primaria che sono divisibili per 5 e, in caso di eliminazioni, potrebbero non essere effettivamente ogni 5a fila

Questo può essere fatto proprio all'interno della query SQL o richiederà il ciclo riga per riga attraverso il set di risultati usando i cursori?

Sto usando MySQLi in PHP per connettermi al DB.

È stato utile?

Soluzione

L'elenco dei timestamp ogni 5 minuti:

SELECT
  MIN(logtimestamp) AS first_of_five_minutes
FROM tLog
GROUP BY
  DATE(logtimestamp),
  HOUR(logtimestamp),
  MINUTE(logtimestamp) - (MINUTE(logtimestamp) % 5)

Ora puoi usarlo come sottoselezione per ottenere le voci di registro richieste unendo logtimestamps a first_of_five_minutes sul. Naturalmente, le clausole WHERE - aggiuntive devono essere replicate all'interno e all'esterno in modo da ottenere il & Quot; right & Quot; timestamp.

Inoltre, tieni presente che questo restituisce il primo timestamp in ogni intervallo di cinque minuti, mentre le soluzioni che utilizzano direttamente minutes%5 = 0 restituiscono solo i logentries che sono in realtà su multipli di: 05, il che potrebbe fallire se hai ritardi nella registrazione dei log o simili .

Altri suggerimenti

completamente non testato ma potrebbe funzionare

SELECT Row, col_a 
FROM (SELECT @row := @row + 1 AS Row, col1 AS col_a FROM table1) As derived1 
WHERE Row%5 = 0; 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top