MYSQL 订单查询求助

2020-12-30 15:15:32 +08:00
 marine2c

假设有一张订单表 A,有下单时间和 IP,要求查出任意 30 分钟内同一 IP 交易超过 20 次的记录,该怎么写?自己想的是 group by ip,但是怎么控制任意 30 分钟以内呢

3859 次点击
所在节点    MySQL
37 条回复
Latin
2020-12-30 15:17:07 +08:00
这个任意很模糊,时间不能关联查询了吗?
marine2c
2020-12-30 15:20:10 +08:00
@Latin 不能,时间和其他没有任何关系啊,就是只要你在任意 30 分钟间隔内下单超过 20 次就查询出来
ingxx
2020-12-30 15:21:21 +08:00
可以考虑一下 Prometheus
marine2c
2020-12-30 15:23:05 +08:00
@ingxx 用的是 MySQL,要求用 sql 语句或存储过程
msaionyc
2020-12-30 15:43:47 +08:00
每条订单记录,往前取三十分钟内的所有订单( ip 过滤),count,然后该分组就分组
lpts007
2020-12-30 15:51:33 +08:00
@marine2c 谁要求的啊,是面试题吗

1. 一秒一秒往前推,查 3600 次能把时间往前推 1h,后台查完另存起来,以后查这个新表。
2. distinct ip,循环处理,同一个 ip 一条记录查一次半小内的数据 count, > 20 处理下一个 ip, 否则 下一条不同于上条时间的记录。后台查完另存起来,以后查这个新表。
marine2c
2020-12-30 15:59:31 +08:00
@lpts007 工作内容,方式 2 效率高点吧,一秒一秒推太多循环了吧
Jeyfang
2020-12-30 16:11:29 +08:00
任意 30 分钟怎么理解,比如现在 15:00,那要查出 13:00 的,这 30 分钟是指 12:30-13:00 ?
marine2c
2020-12-30 16:14:49 +08:00
@Jeyfang 是的,就是任意时间点往后推 30 分钟嘛。
Jeyfang
2020-12-30 16:23:04 +08:00
那就 6 楼的第 2 个方法吧。如果数据量比较少,直接全部取出来,然后自己计算。如果数据量大的话,是否可以以 1 分钟为单位,每次下单的时候,做一个统计,相当于在一个线性的轴上面记录,然后直接从轴上面统计
gogo789
2020-12-30 16:25:17 +08:00
where 下单时间 between 开始时间 and 结束时间 group by ip having count > 20 ?
fx050622
2020-12-30 16:30:05 +08:00
是不是可以理解为 下单之后连续 30 分钟内下单超过 20 次的用户?
select a.ip,a.下单时间,b.下单时间 from a,b where a.会员=b.会员 and b.下单时间<=a.下单时间+30

group by a.ip,a.下单时间 count(b.下单时间)
marine2c
2020-12-30 16:36:21 +08:00
@fx050622 你的 a,b 指的是同一张表吗?好像有点意思
fx050622
2020-12-30 16:37:00 +08:00
@marine2c 是的,自关联一下
fish267
2020-12-30 16:39:44 +08:00
起个调度,一直查呗,group by ip
caola
2020-12-30 16:49:09 +08:00
按时间排序,每次拿 20 条记录( 1-20 ),下次拿 20 条( 2-21 ),
比较一下这 20 条中最早的一条和最后的一条的间隔时间,是否在 30 分钟内的
xiaoxinshiwo
2020-12-30 17:24:23 +08:00
ES
dobelee
2020-12-30 17:26:39 +08:00
把订单异步索引到 es,想怎么查怎么查。
rrfeng
2020-12-30 17:35:22 +08:00
写 SQL 难,做个 20 长的队列,遍历一遍就行。
LEFT
2020-12-30 19:15:53 +08:00
有一个方法:核心是两次 row_num 加自关联

传送门
https://muguayuan.com/2020/16111.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/740336

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX