Wie wählst du jede n-te Zeile von mysql aus?

Ich habe eine Reihe von Werten in einer database, 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 fünfte Zeile aus der database auswähle.

SELECT * FROM ( SELECT @row := @row +1 AS rownum, [column name] FROM ( SELECT @row :=0) r, [table name] ) ranked WHERE rownum % [n] = 1 

Sie könnten mod 5 versuchen, um Zeilen zu erhalten, deren ID ein Vielfaches von 5 ist. (Angenommen, Sie haben eine Art ID-Spalte, die sequenziell ist.)

 select * from table where table.id mod 5 = 0; 

Da Sie angegeben haben, dass Sie MySQL verwenden, können Sie mit Benutzervariablen eine fortlaufende Zeilennummerierung 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 ORDER BY RAND() hinzugefügt, um eine Pseudozufallsabtastung zu erhalten, anstatt jede fünfte Zeile der ungeordneten Tabelle jedes Mal in der Stichprobe zu lassen.


Ein anonymer Benutzer hat versucht, dies zu bearbeiten, um x MOD 5 = 0 zu x MOD 5 = 1 zu ändern. Ich habe es wieder auf mein Original geändert.

Für den Datensatz kann man in diesem Zustand einen beliebigen Wert zwischen 0 und 4 verwenden, und es gibt keinen Grund, einen Wert einem anderen vorzuziehen.

 SET @a = 0; SELECT * FROM t where (@a := @a + 1) % 2 = 0; 

Ich hatte so etwas gesucht. Die Antwort von Taylor und Bill hat mich dazu gebracht, ihre Ideen zu verbessern.

Tabelle data1 hat Felder read_date, Wert wir wollen jeden 2d Datensatz aus einer Abfrage auswählen die durch einen read_date Bereich begrenzt ist Der Name der abgeleiteten Tabelle ist beliebig und heißt hier DT

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 
 $Query = "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: