Zeile vor der SELECT-Abfrage abrufen

8

Ich habe eine Tabelle namens "mytable". Die Spalten sind

%Vor%

Ich möchte nach Time_Stamp und Time_stamp_ms sortieren (ich weiß, wie man das aus einer anderen Frage macht) und dann, wenn jeder Zeitzyklus 1 erreicht, möchte ich Time_Stamp und Time_Stamp_ms aus der vorherigen Zeile holen. Zyklus ist 1,2,3,4 ...... n Bedeutet, dass es immer um 1 erhöht wird.

Diese Tabelle wird wahrscheinlich Millionen und Millionen von Zeilen haben.

Auch kein PHP.

Es gibt ein Beispiel meiner Tabelle:

%Vor%

Sollte mich zurückgeben:

%Vor%     
riahc3 30.04.2014, 06:44
quelle

5 Antworten

4

Wie in den Kommentaren erwähnt, benötigen Sie wirklich ein Feld, das die Reihenfolge der Zeilen angibt. Ein pkey int primary key auto_increment -Feld garantiert nicht, dass die neueste Zeile immer die größte ID hat, streng genommen funktioniert das also nicht 100% ig. Eine Spalte mit genauer Einfügezeit würde reichen.

Ich nehme an, dass (obwohl ich weiß, dass Ihr Wertfeld eins ist, mit dem sortiert werden kann), dass diese Abfrage Ihnen jede Zeile liefert, die vor einer ID = 1 liegt. Um ein korrektes Ergebnis zu erhalten, erstellen Sie ein Feld in der richtigen Reihenfolge und ersetzen Sie value durch dieses Feld in den beiden order by -Klauseln

aktualisierte Abfrage: Ссылка

%Vor%

Eine zusätzliche Anmerkung. Wenn Sie mit einem großen Dataset arbeiten, können Sie die Leistung drastisch verbessern, indem Sie die innere Abfrage in eine temporäre Tabelle einfügen, nachOne indexieren und dann das Endergebnis auswählen. MySQL ist dafür bekannt, dass es mit Subquerys langsam ist.

PS. hmm, ich sehe jetzt, dass ich vielleicht schlecht gewählt habe, nachdem man vorher wirklich gemeint hat, wenn man aufsteigt. Naja, es ist sowieso ein Platzhalter, man kann alles benennen, was Sinn macht.

    
Noino 30.04.2014 07:11
quelle
3

Wie mcalex sagte

Sie haben keinen Primärschlüssel. 2. Die Reihenfolge der Datenreihen sollte nicht wichtig sein. Wenn Sie diese Zeilen sortiert haben möchten, benötigen Sie ein Feld, das Ihnen dabei hilft. DANN kannst du die Zeile vor einer bestimmten Zeile anfordern.

Versuchen Sie es

%Vor%

Geigen-Demo

Ausgabe

%Vor%     
Vignesh Kumar 30.04.2014 07:15
quelle
1

Meine erste Wahl wäre wahrscheinlich, einen der obigen Vorschläge zu verwenden, um eine Sequenznummer zu erzeugen. Bei einer großen Anzahl von Datensätzen kann der Aufbau einer solchen Sequenz jedoch langsam sein (besonders wenn Sie dann mehr Datensätze ignorieren).

Eine andere Möglichkeit besteht jedoch darin, einen Join zu machen. Das ist unordentlicher, da Sie zwei Spalten haben, um zu bestimmen, welcher der vorherige Datensatz ist.

Nicht getestet, aber in etwa so: -

%Vor%

Dies könnte wesentlich vereinfacht werden, wenn Sie nur die Zeitstempel und keine anderen Daten wünschen und wenn Sie ein kombiniertes Feld für Datum / Uhrzeit / Millisekunde hätten (Sie könnten dann die Unterabfrage verwenden). Noch einfacher, wenn Sie nur alle Datensätze mit einem sequentiellen ID-Feld (dh, in dieser Reihenfolge Garnte) haben.

BEARBEITEN - Vereinfacht, wenn Sie nur die letzte Aufzeichnung vor Zyklus 1 wünschen: -

%Vor%

BEARBEITEN Sie erneut.

Sie könnten ein Dezimalfeld für den kombinierten Zeitstempel hinzufügen (fügen Sie einen Index dafür hinzu) und füllen Sie ihn mit: -

%Vor%

Dann könnten Sie die folgende SQL verwenden, um die gewünschten Datensätze zu erhalten: -

%Vor%     
Kickstart 30.04.2014 09:21
quelle
0

Wenn es nur eine kleine Tabelle ist, mit der Sie arbeiten (unter 10.000 Zeilen), ist die beste Lösung, das Ganze zu holen und die Zeilen "manuell" (= in einer PHP-Schleife) auszuwählen. Es wird sicherlich viel schneller als jede SQL-basierte Lösung sein, wenn man bedenkt, dass Sie nur IDs und einen Primärschlüssel zum Auswählen der resultierenden Zeilen abrufen.

Wenn Sie von einer streng SQL-basierten Lösung sprechen, benötigen Sie eine gespeicherte Prozedur und einen Cursor, um die Ergebnismenge zu durchlaufen (dies ermöglicht es Ihnen, einen Schritt zurück zu setzen) - aber es ist nicht sehr effizient, da Sie die gesamte Tabelle abfragen müssen Mach das Matching eins nach dem anderen. Auf Indizes basierende Abfragen können das NICHT machen , also wird jede SQL-Lösung, die Sie bekommen, die gesamte Tabelle durchlaufen (macht einen "vollständigen Scan") und wird daher nicht schnell sein.

UND JA, die vorherigen Antworten stimmen insofern, als die Reihenfolge der Zeilen nicht wichtig ist. Sie sind irgendwie "zufällig", oder zumindest sollten Sie sie so betrachten, als ob sie es wären. (Selbst wenn Sie eine ALTER TABLE ... ORDER BY ausführen, können Sie nach der nächsten Operation, die eine einzelne Zeile ändert, nicht sicher sein.)

    
dkellner 30.04.2014 08:01
quelle
0

Posted als eine andere Antwort, wie es kompliziert wird, und das ist mehr eine Rede durch eine zusätzliche Option.

Es wäre einfacher, einen Join zu machen, wenn es eine indizierte Spalte gäbe, um nach dem letzten Datensatz zu suchen, oder die letzte Gruppe von Zyklen zu überprüfen.

Wenn Sie eine Spalte für die Zyklusnummer hinzufügen, können Sie sie zunächst mit folgenden Daten füllen: -

%Vor%

dann

%Vor%

Der erste Eintrag füllt cycle_no für den eacg-Zyklus von 1 und der zweite füllt alle anderen cycle_no-Werte

Sie können es mit dem folgenden Trigger gefüllt halten (es könnte einen effizienteren Weg dafür geben).

%Vor%

Sie können dann die letzten Werte wie folgt erhalten (was darauf beruht, dass cycle_no nur um 1 erhöht wird): -

%Vor%

Bei den Testdaten (~ 7,5 Millionen Datensätze) habe ich ~ 53 Sekunden gebraucht. Nicht sicher, ob das für Sie verwendbar wäre.

    
Kickstart 06.05.2014 11:46
quelle

Tags und Links