Ich habe eine Reihe von Werten in einer Datenbank, die ich ziehen muss, um ein Liniendiagramm zu erstellen. Da ich keine hohe Auflösung benötige, möchte ich die Daten neu abtasten, indem ich jede 5. Zeile aus der Datenbank auswähle.
79
[n]
in der Abfrage durch 5 ersetzen , um jede 5. Zeile zu erhalten.@row :=0
mit@row :=2
= 1
zu= 2
Sie könnten Mod 5 versuchen , um Zeilen zu erhalten, bei denen die ID ein Vielfaches von 5 ist. (Angenommen, Sie haben eine Art ID-Spalte, die sequentiell ist.)
select * from table where table.id mod 5 = 0;
quelle
Da Sie sagten, dass Sie MySQL verwenden, können Sie Benutzervariablen verwenden , um eine fortlaufende Zeilennummerierung zu erstellen. Sie müssen dies jedoch in eine abgeleitete Tabelle (Unterabfrage) einfügen.
SET @x := 0; SELECT * FROM (SELECT (@x:=@x+1) AS x, mt.* FROM mytable mt ORDER BY RAND()) t WHERE x MOD 5 = 0;
Ich habe hinzugefügt
ORDER BY RAND()
, um eine pseudozufällige Stichprobe zu erhalten, anstatt zuzulassen, dass jedes Mal jede fünfte Zeile der ungeordneten Tabelle in der Stichprobe enthalten ist.Ein anonymer Benutzer versucht , zu bearbeiten , dies zu ändern ,
x MOD 5 = 0
umx MOD 5 = 1
. Ich habe es wieder auf mein Original geändert.Für die Aufzeichnung kann in diesem Zustand ein beliebiger Wert zwischen 0 und 4 verwendet werden, und es gibt keinen Grund, einen Wert einem anderen vorzuziehen.
quelle
SET @a = 0; SELECT * FROM t where (@a := @a + 1) % 2 = 0;
quelle
Ich hatte nach so etwas gesucht. Die Antwort von Taylor und Bill veranlasste mich, ihre Ideen zu verbessern.
Die Tabelle data1 hat die Felder read_date, den Wert, den wir für jeden 2D-Datensatz aus einer Abfrage auswählen möchten, die durch einen read_date-Bereich begrenzt ist. Der Name der abgeleiteten Tabelle ist willkürlich und wird hier als DT bezeichnet
Abfrage:
SET @row := 0; SELECT * FROM ( SELECT @row := @row +1 AS rownum, read_date, value FROM data1 WHERE read_date>= 1279771200 AND read_date <= 1281844740 ) as DT WHERE MOD(rownum,2)=0
quelle
SET @row := 0; SELECT count(distinct Message) FROM ( SELECT @row := @row +1 AS rownum, Message FROM operations.EventLog WHERE LogTime > now() - interval 6 hour and ProcedureName = 'Do_CDR' ) as DT WHERE MOD(rownum,2)=0;
Sie können diese Abfrage verwenden,
set @n=2; <!-- nth row --> select * from (SELECT t.*, @rowid := @rowid + 1 AS ID FROM TABLE t, (SELECT @rowid := 0) dummy) A where A.ID mod @n = 0;
oder Sie können n durch Ihren n-ten Wert ersetzen
quelle
SELECT * FROM ( SELECT @row := @row +1 AS rownum, posts.* FROM ( SELECT @row :=0) r, posts ) ranked WHERE rownum %3 = 1
Wo Beiträge ist mein Tisch.
quelle
Wenn Sie MariaDB 10.2, MySQL 8 oder höher verwenden, können Sie dies effizienter tun, und ich denke klarer, indem Sie allgemeine Tabellenausdrücke und Fensterfunktionen verwenden .
WITH ordering AS ( SELECT ROW_NUMBER() OVER (ORDER BY name) AS n, example.* FROM example ORDER BY name ) SELECT * FROM ordering WHERE MOD(n, 5) = 0;
Konzeptionell wird dadurch eine temporäre Tabelle mit dem Inhalt der
example
nachname
Feld geordneten Tabelle erstellt , ein zusätzliches Feld namensn
Zeilennummer hinzugefügt und dann nur die Zeilen mit Zahlen abgerufen, die genau durch 5 teilbar sind, dh jede 5. Zeile. In der Praxis kann das Datenbankmodul dies häufig besser optimieren. Aber selbst wenn es nicht weiter optimiert wird, ist es meiner Meinung nach klarer, als Benutzervariablen iterativ zu verwenden, wie Sie es in früheren Versionen von MySQL getan haben.quelle
Wenn Sie die Zeilennummer in der Ergebnismenge nicht benötigen, können Sie die Abfrage vereinfachen.
SELECT [column name] FROM (SELECT @row:=0) temp, [table name] WHERE (@row:=@row + 1) % [n] = 1
Ersetzen Sie die folgenden Platzhalter:
[column name]
durch eine Liste der Spalten, die Sie abrufen müssen.[table name]
durch den Namen Ihrer Tabelle.[n]
eine Nummer ersetzen . Wenn Sie beispielsweise jede 5. Reihe benötigen, ersetzen Sie sie durch 5quelle