Wie kann ich alle n Zeilen in MySQL erhalten?
Frage
Ich habe eine Tabelle, die Daten jede Minute aufgezeichnet enthält, so habe ich eine Zeile für jede Minute. Wenn die Daten für die Verarbeitung zurückkehrt, wird diese Genauigkeit für die letzten 6 Stunden erforderlich, aber danach wird ein geringeres Maß an Genauigkeit ist ausreichend, z.B. alle 5 Minuten.
kann ich alle Daten in ein Array zurückgeben und dann alle, aber jedes fünftes Element entfernen, aber das erfordert, dass alle Daten zurückgegeben von MySQL und dann in das Array zuerst lesen -. Eine ganze Menge von Daten
Wie kann ich jede n-te Zeile in MySQL zurückkehren? Ich habe diese Blog-Post, die unter Verwendung schlägt primaryKey% 5 = 0, wobei primaryKey auto_increment ist aber
a) keine Indizes verwenden b) nur primaryKey Werte zurück, die von 5 und im Fall von Deletionen teilbar sind, möglicherweise nicht tatsächlich jede fünfte Zeile
Kann man das nur in der SQL-Abfrage durchgeführt werden oder wird es Zeile für Zeile durch die Ergebnismenge mit Cursor erfordern Looping?
Ich bin mit MySQLi in PHP an die DB zu verbinden.
Lösung
Die Liste der Zeitstempel 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 logtimestamps
Beitritt auf dem first_of_five_minutes
. Natürlich haben zusätzliche WHERE
-Klauseln innerhalb und außerhalb repliziert werden, so dass Sie den „richtigen“ Zeitstempel erhalten.
Beachten Sie auch, dass dies den ersten Zeitstempel in jedem Fünf-Minuten-Intervall gibt, wheras Lösungen direkt nur mit minutes%5 = 0
logentries zurück, die auf ein Vielfach von tatsächlich ist. 05, die fehlschlagen, wenn Sie Verzögerungen bei der Aufnahme Protokollen oder ähnliches haben
Andere Tipps
völlig ungetestet aber dies könnte funktionieren
SELECT Row, col_a
FROM (SELECT @row := @row + 1 AS Row, col1 AS col_a FROM table1) As derived1
WHERE Row%5 = 0;