日期:2014-05-16  浏览次数:20803 次

如何在分组数据中选择某种顺序的数据?
-----------------
tbl_test
-----------------
索引有 toid_gid_dateline 顺序的联合索引

toid(int) gid(int) dateline(int) other(vchar)
1 1 111 ...
2 1 111 ...
1 1 222 ...
1 2 111 ...
比如有这种类型的数据。
我想找 toid为1, gid为1的, dateline升序排行100的数据很容易
select * from tbl_test where toid=.. gid=.. order by dateline limit 100, 1
想找touid为1, gid为2, 依次类推。。
现在想找这种数据的集合, 需要指定的TOID在某个GID里面的记录数量超过100的GID, 找出这种分组里面按时间排序的
第100个数字。 得到 (gid, gid_count, order_100_dateline) 的数据集。
想过下面的语句, 但是group后的数据没法排序, 一些max等聚合函数获取的又是极大或极小值, 不知道有没什么好办法。
表数据千万级, 执行的比较频繁, 需要性能快, 可以之后建索引。
目前的SQL语句
select gid, dateline from tb_test where toid=1 group by gid having count(gid)>100 
这个dateline没有参考价值。。
于是程序循环
for each __gid in gids do
  select gid, dateline from tb_test where toid=1 and gid=__gid order by dateline limit 100, 1
end
然后把这些数据整理起来, 感觉很恶心。。。。。。


--------------------
补充下问题, 这么做是因为有个需求,需要保证在表中,对于toid和gid的组合,保证不超过N条记录(100), 否则移除dateline最小的, 原来是插入的时候做, 后来是GET操作的时候批量做。 想尽可能快。
刚刚的想法是想得到这个用户哪些gid记录数超了100,拿到第100那条的时间点的记录,然后在批量
for each__gid in gids do
  delete from tb_test where toid=1 and gid=__gid where dateline < __dateline


还有一个问题,如果我想按照时间顺序排序,删除除最近100条记录外的数据如何处理?
最近100条貌似可以
delete from tb_test where ... roder by dateline limit 100;
但是排除这100条的记录删除不知道咋写, where not in的子查询太慢~~!

------解决方案--------------------
还有一个问题,如果我想按照时间顺序排序,删除除最近100条记录外的数据如何处理?
最近100条貌似可以
delete from tb_test where ... roder by dateline limit 100;

在dateline上建立索引
delete a from tt a inner join (select dateline from tt order by dateline desc limit 100) b
on a.dateline=b.dateline
------解决方案--------------------
看到100分我就进来了