你如何从mysql中选择每一行

时间:2009-05-13 15:49:10

标签: mysql

我在数据库中有一系列值,我需要用它来创建折线图。因为我不需要高分辨率,所以我想通过从数据库中选择每第5行重新采样数据。

9 个答案:

答案 0 :(得分:70)

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

答案 1 :(得分:51)

您可以尝试mod 5来获取ID为5的倍数的行。(假设您有某种ID列是连续的。)

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

答案 2 :(得分:22)

由于您说您正在使用MySQL,因此可以使用user variables创建连续的行编号。您必须将它放在派生表(子查询)中。

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 = 0更改为x MOD 5 = 1。我把它改回原来的。

对于记录,在这种情况下,可以使用0到4之间的任何值,并且没有理由偏好一个值而不是另一个值。

答案 3 :(得分:8)

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

答案 4 :(得分:2)

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

表data1的字段为read_date,value 我们希望从read_date范围限制的查询中选择每个2d记录 派生表的名称是任意的,这里称为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

答案 5 :(得分:1)

如果您使用的是MariaDB 10.2,MySQL 8或更高版本,则可以提高效率,并且我想更清楚地使用common table expressionswindow functions

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;

从概念上讲,这将创建一个临时表,其内容由example字段排序的name表的内容,添加一个名为n的行号的附加字段,然后提取只有那些数字可以被5整除的行,即每5行一次。实际上,数据库引擎通常能够对此进行更好的优化。但是,即使它没有进一步优化它,我认为它也比在早期版本的MySQL中必须反复使用user variables更清楚。

答案 6 :(得分:0)

$Query = "SELECT *
          FROM ( 
                SELECT @row := @row +1 AS rownum, posts.*
                FROM (
                       SELECT @row :=0) r, posts
                     ) ranked
                WHERE rownum %3 =1";

帖子是我的桌子:

答案 7 :(得分:0)

您可以使用此查询,

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;

,或者您可以将 n 替换为您的 nth值

答案 8 :(得分:0)

如果在结果集中不需要行号,则可以简化查询。

SELECT 
    [column name] 
FROM
    (SELECT @row:=0) temp, 
    [table name] 
WHERE (@row:=@row + 1) % [n] = 1 

替换以下占位符:

  1. 用您需要提取的列列表替换[column name]
  2. 用表名替换[table name]
  3. 用数字替换[n]。例如如果您需要第5行,则将其替换为5