表Asn    states   tableid
0      0       1255024
0      0       1526481
0      0       1897542
1      0       1987458
1      0       1254875
1      1       1655884
2      2       1689556
2      0       1874257
2      1       1154882
...想获得的结果每个sn的前2行sn    states   tableid
0      0       1255024
0      0       1526481
1      0       1987458
1      0       1254875
2      2       1689556
2      0       1874257
...求MySQL的解决方法。

解决方案 »

  1.   

    按什么排序取前两条?按tableid排序:
    select * from A t
    where 2>
    (select count(*) from A
    where sn=t.sn and tableid<t.tableid);
      

  2.   

     SELECT a.sn,a.states,a.tableid  FROM test1   a  
     LEFT JOIN test1 b                               
     ON a.sn=b.sn AND a.tableid <=b.tableid          
     GROUP BY a.sn,a.states,a.tableid                
     HAVING COUNT(b.sn) <=2                          
      

  3.   

    参考一下这个贴子中的各种方法。分组取最大N条记录方法征集
    http://topic.csdn.net/u/20091231/16/5c5fd526-b2bc-42bf-9a20-92b82b1e9452.html
      

  4.   

    数据表目前30w条记录,需要操作的数据记录会控制在600w左右,所以需要做一些过滤的动作。上面两位仁兄提供的方法在mysql客户端和命令行执行基本是客户端宕掉,命令行长时间无返回。
      

  5.   

    因为在你的表中没有唯一标识的字段,加入自增字段ID
    select a.sn,a.states,a.tableid from tt a left join tt b 
    on a.sn=b.sn and a.id>=b.id
    group by a.sn,a.states,a.tableid
    having count(b.id)<=2
      

  6.   

    or
    SELECT a.sn,a.states,a.tableid FROM tt a 
    WHERE 2>=( 
    SELECT COUNT(*) FROM tt b 
    WHERE a.sn=b.sn and a.id>=b.id) 
      

  7.   

    如果这样,用SQL语句实现的速度不会太快,不如用存储过程或程序来实现了。 
      

  8.   

    这个表是由两个表连接创建的视图,tableid也可能重复。在创建视图时无法直接添加自增字段。sn+tableid可以唯一标示一条记录,或者有什么方法可以给视图添加自增字段。
      

  9.   


    实际所有的想法都是为了提高速度,这些数据都是按照一定的规则排序以后生成的视图,之所以想取出每个分组的前N条记录,就是为了获得满足条件的tableid,实现对实体表数据的批量删除。如果我在程序中用sn一个个迭代查找,性能也不会高。在实际中,想把这个操作做成一个job,但是还需要获得上司的认可啊~~
      

  10.   

    你试试
    ELECT DISTINCT a2.* FROM tt6 a2 INNER JOIN (
    SELECT *,(SELECT tableid FROM tt6 b WHERE b.sn=a.sn LIMIT 1) AS n1,
    (SELECT tableid FROM tt6 b WHERE b.sn=a.sn LIMIT 1,1) AS n2
     FROM tt6 a) a3 ON a2.sn=a3.sn AND (a2.tableid IN(a3.n1,a3.n2))看看速度如何
      

  11.   

    无论怎么实现,如果用SQL语句都必然会出现全表扫描,这无法避免。
    所以还不如用程序或存储过程, select * from 表A order by sn  , tableid  然后在程序中只能第个SN的前两个。这样只是一次全表扫描。速度上应该最快。
      

  12.   

    看FAQ,分组数据的提取!!!!