2009-02-02 11 views
9

Ich habe eine Tabelle, die jede Minute Daten aufgezeichnet enthält, so dass ich eine Zeile für jede Minute habe. Wenn die Daten zur Verarbeitung zurückgegeben werden, ist diese Genauigkeit für die letzten 6 Stunden erforderlich, aber danach ist ein niedrigeres Maß an Genauigkeit ausreichend, z. alle 5 Minuten.Wie kann ich alle n Zeilen in MySQL bekommen?

Ich kann alle Daten in ein Array zurückgeben und dann entfernen alle bis auf jedes fünfte Element, aber das erfordert alle Daten von MySQL zurückgegeben und dann zuerst in das Array gelesen - ziemlich viele Daten.

Wie kann ich jede n-te Zeile in MySQL zurückgeben? Ich habe this Blog-Post zu lesen, die primaryKey% unter Verwendung schlägt vor 5 = 0, wobei primaryKey ist auto_increment aber

a) keine Indizes verwenden b) nur primaryKey Werte zurück, die von 5 und im Fall von Deletionen teilbar sind , kann nicht tatsächlich jede fünfte Zeile sein

Kann dies nur innerhalb der SQL-Abfrage getan werden, oder wird es erforderlich, Zeile für Zeile durch die Ergebnismenge mit Cursoren Schleifen?

Ich verwende MySQLi in PHP, um eine Verbindung zur DB herzustellen.

Antwort

3

Die Liste der Zeitstempel arbeiten alle 5 Minuten:

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

Jetzt können Sie diese als Sub-select verwenden, um die angeforderten Protokolleinträge zu erhalten, indem beitreten logtimestamps zu first_of_five_minutes auf der. Natürlich müssen zusätzliche WHERE -Klauseln innen und außen repliziert werden, damit Sie die "richtigen" Zeitstempel erhalten.

Beachten Sie auch, dass dies den ersten Zeitstempel alle fünf Minuten zurückgibt, während Lösungen, die direkt minutes%5 = 0 verwenden, nur Ogentries zurückgeben, die tatsächlich ein Vielfaches von: 05 sind, was bei Verzögerungen bei der Aufzeichnung von Protokollen o.ä.

+0

Das schien nicht zu funktionieren - es hat nur alle Zeilen aufgelistet. Allerdings habe ich es angepasst Dies funktioniert - SELECT logtimestamp FROM Tabelle WHERE MINUTE (Logtimestamp)% 5 = 0 Hinweis Ich speichern Zeitwerte als Unix-Zeitstempel so benötigt, um FROM_UNIXTIME auch verwenden .. – DavidM

+0

Ich integrierte Teile Ihres Kommentars. –

0

völlig ungetestet aber dies könnte

SELECT Row, col_a 
FROM (SELECT @row := @row + 1 AS Row, col1 AS col_a FROM table1) As derived1 
WHERE Row%5 = 0; 
+0

Gibt nichts zurück. – DavidM

+0

gibt es nichts ohne die Where-Klausel zurück? Sorry, aber ich habe im Moment keinen Zugang zu mysql und kann es nicht an meinem Ende testen :( – Learning

+0

Es gibt jede Zeile ohne WHERE zurück – DavidM

Verwandte Themen