• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

怎么在分组数据中选择某种顺序的数据

mysql 搞代码 7年前 (2018-05-31) 180次浏览 已收录 0个评论

如何在分组数据中选择某种顺序的数据?
—————–
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分我就进来了


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:怎么在分组数据中选择某种顺序的数据
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址