各位,需求是这样的。
表 ta 列 _id aid cid 
现在想删除: 如果cid一样,那么删除这些数据中aid第20大以外的数据。
也就是说每个cid对应最多只会有20条数据。比如:aid有1,2,3,4,****,28 cid都为2。 aid:30,31,32,*****,58 cid都为3.  
那么删除aid是21到28的数据,并且删除aid是51到58的数据。这个sql语句应该怎么写呢?我用的是sqlite,不过数据库到是无所谓,大家还是给一下思路吧。

解决方案 »

  1.   

    上传你的DB到www.access911.net/csdn
    ,用WINRAR压缩
    假设AID唯一,可以用查询来解决
    要重新生成1个序列号
      

  2.   

    实际情况可能会不一样,所以上面所说的是问题的简化,如果有什么疑问,我尽量解释清楚。。说明下: aid不会重复。因为aid为1到28的数据cid都是2,所以由于每个cid对应的数据只能保存20个,那么,要删除掉21到28,同理,要删掉表中cid为3,aid为51到58的数据。
      

  3.   

    直接上传数据库 ,节省时间,基本思路就是:根据AID、CID重新生成1个序列号
      

  4.   

    建立临时表以aid降序排列,以cid分组,limit 20;然后通过关联原表和临时表的aid来删除
      

  5.   

    先大概说下我的思路,我想先选出每个cid相同的数据中第20大的aid,然后用条件去删除:
    select max(aid) as max_id from TA where cid in (select distinct cid from TA) order by aid desc limit 20,但这样就不知道怎么group by了,怎么能查出每个cid中最大的aid,而不是所有组中最大的aid。
      

  6.   

    取得要删除的idselect id
    from tb A
    where (select count(*) from tb A.cid=cid and A.aid>aid) > 20
      

  7.   


    楼上说的是不是这个意思
    select max(aid) from TA order by aid desc limit 20
      

  8.   

    上面写错了  是不是这句:
    select max(aid) from TA where TA.cid=cid order by aid desc limit 20
      

  9.   

    其实,我想干的就是个这样的事情:int[] cids = select distinct cid from TA
    for(int c : cids){
        delete from TA where aid>(select max(aid) from TA where cid=c order by aid desc limit 20) and cid=c
    }怎么能写的真正的sql语句呢??
      

  10.   

    http://access911.net/csdn/FileDescription.asp?mdb=2011-7-15&id=15
    已经上传,具体要操作的是article表,这里的cid对应里面的categoryId,aid是他(article)本身的_id
    请问还需要其他信息么?
      

  11.   

    select * from article a where 20<=(select count(*) from article
    where a.category_id=category_id and a._id>_id )>20以外的记录,删除应该会吧