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.
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.
Antworten:
SELECT *
FROM (
SELECT
@row := @row +1 AS rownum, [column name]
FROM (
SELECT @row :=0) r, [table name]
) ranked
WHERE rownum % [n] = 1
[n]in der Abfrage durch 5 ersetzen , um jede 5. Zeile zu erhalten.
@row :=0mit@row :=2
= 1zu= 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;
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 = 0um x 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.
SET @a = 0;
SELECT * FROM t where (@a := @a + 1) % 2 = 0;
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
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
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 examplenach nameFeld geordneten Tabelle erstellt , ein zusätzliches Feld namens nZeilennummer 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.
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 5