当前位置: 代码迷 >> Sql Server >> 求教MySql怎么抽样取数据
  详细解决方案

求教MySql怎么抽样取数据

热度:53   发布时间:2016-04-24 08:46:15.0
求教MySql如何抽样取数据?
假设一张数据表有N条记录(ID不连续),我想一条语句取出 第1,101,201,301,401,·····条记录,该肿么办呢?
------解决思路----------------------
SET @i = 0;
SELECT (@i:=@i+1) AS nid, id FROM  tbl
WHERE nid MOD 100 = 1
------解决思路----------------------
mod取模,模100结果为1即可
where mod(行号,100)=1
行号自己求了
------解决思路----------------------
2:
SELECT * FROM
(
SELECT (@i:=@i+1) AS i, tbl.* FROM tbl, (SELECT @i:=0) AS it 
) AS t
WHERE t.i MOD 100 =1
------解决思路----------------------

这里运用mysql的用户定义变量,来实现递增:

mysql> select @row:= @row+1 as row,t.* from tb2 t,(select @row := 0)r;
+------+------+------+

------解决思路----------------------
 row  
------解决思路----------------------
 id   
------解决思路----------------------
 name 
------解决思路----------------------

+------+------+------+

------解决思路----------------------
    1 
------解决思路----------------------
    1 
------解决思路----------------------
 aa   
------解决思路----------------------


------解决思路----------------------
    2 
------解决思路----------------------
    1 
------解决思路----------------------
 bb   
------解决思路----------------------


------解决思路----------------------
    3 
------解决思路----------------------
    1 
------解决思路----------------------
 cc   
------解决思路----------------------


------解决思路----------------------
    4 
------解决思路----------------------
    1 
------解决思路----------------------
 aa   
------解决思路----------------------


------解决思路----------------------
    5 
------解决思路----------------------
    2 
------解决思路----------------------
 aa   
------解决思路----------------------


------解决思路----------------------
    6 
------解决思路----------------------
    2 
------解决思路----------------------
 bb   
------解决思路----------------------


------解决思路----------------------
    7 
------解决思路----------------------
    2 
------解决思路----------------------
 dd   
------解决思路----------------------


------解决思路----------------------
    8 
------解决思路----------------------
    2 
------解决思路----------------------
 cc   
------解决思路----------------------


------解决思路----------------------
    9 
------解决思路----------------------
   10 
------解决思路----------------------
 a    
------解决思路----------------------


------解决思路----------------------
   10 
------解决思路----------------------
    1 
------解决思路----------------------
 a    
------解决思路----------------------


------解决思路----------------------
   11 
------解决思路----------------------
    2 
------解决思路----------------------
 a    
------解决思路----------------------


------解决思路----------------------
   12 
------解决思路----------------------
    1 
------解决思路----------------------
 b    
------解决思路----------------------

+------+------+------+
12 rows in set (0.01 sec)


然后,在取模数就可以了:

mysql> select * from (select @row:= @row+1 as row,t.* from tb2 t,(select @row := 0)r) t where t.row mod 100 =1;
+------+------+------+

------解决思路----------------------
 row  
------解决思路----------------------
 id   
------解决思路----------------------
 name 
------解决思路----------------------

+------+------+------+

------解决思路----------------------
    1 
------解决思路----------------------
    1 
------解决思路----------------------
 aa   
------解决思路----------------------

+------+------+------+
1 row in set (0.02 sec)

------解决思路----------------------

具体在理解:
select * from (select @row:= @row+1 as row,t.* from tb2 t,(select @row := 0)r) t where t.row mod 100 =1;

1、(select @row := 0)r 实际上就是构建一个虚拟表,用户定义变量@row ,初始赋值为0

2.、@row:= @row+1  就是对于tb2表的每一行,会重新计算@row变量的值。
比如第一行的时候,@row为0,那么@row+1 = 1,于是第一行就是1.
第二行,就是@row+1 = 1+1 = 2  这么重复下去。
  相关解决方案