Come posso ottenere ogni n righe in MySQL?
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.
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;