你如何从MySQL中select每一个第n行

我在数据库中有一系列的值,我需要创build一个折线图。 因为我不需要高分辨率我想从数据库中select每第五行重新采样数据。

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

你可以尝试mod 5来获取ID是5的倍数的行(假设你有一些顺序的ID列)。

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

既然你说你使用MySQL,你可以使用用户variables来创build一个连续的行编号。 但是你必须把它放在派生表(子查询)中。

 SET @x := 0; SELECT * FROM (SELECT (@x:=@x+1) AS x, mt.* FROM mytable mt ORDER BY RAND()) t WHERE x MOD 5 = 0; 

我加了ORDER BY RAND()来得到一个伪随机采样,而不是让每一个无序表的每一行都在样本中。


一个匿名用户试图编辑这个变化x MOD 5 = 0x MOD 5 = 1 。 我已经把它改回原来的。

为了logging,在这种情况下可以使用0到4之间的任何值,没有理由偏好一个值。

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

我一直在寻找这样的东西。 泰勒和比尔的回答让我改进了他们的想法。

表data1的字段为read_date,我们希望从read_date范围限定的查询中select每个2dlogging,派生表的名称是任意的,这里称为DT

查询:

  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"; 

post是我的表格: