问题背景
1) 限制:每个用户在一个类目下,最多享受4单满送优惠。
即统计享受了满送优惠的订单数时需要排除掉同一类目下第四单以后的订单
如何得到每个用户同一类目下第四单ID呢?
%ign%ignore_a_1%re_pre_1%可惜Mysql并没有分组函数可以方便的得到每组中第四个id。但可以有变通方案, 如有如下的表
select * from t;+----+--------+----------------------------------+| id | status | user_id |+----+--------+----------------------------------+| 1 | 10 | 24e568a88fae11e6bb0650b497d97cdd || 2 | 10 | 24e568a88fae11e6bb0650b497d97cdd || 3 | 20 | 24e568a88fae11e6bb0650b497d97cdd || 4 | 20 | 24e568a88fae11e6bb0650b497d97cdd || 5 | 10 | e8669ac28fae11e6bb0650b497d97cdd || 6 | 20 | e8669ac28fae11e6bb0650b497d97cdd || 7 | 10 | e8669ac28fae11e6bb0650b497d97cdd || 8 | 20 | e8669ac28fae11e6bb0650b497d97cdd || 9 | 10 | e8669ac28fae11e6bb0650b497d97cdd |+----+--------+----------------------------------+
如何得到每个用户第二次成功支付(status=’10’)的订单呢?
青泥AI
青泥学术AI写作辅助平台
302 查看详情

方法一 — 逐个查询
select * from t where user_id = '24e568a88fae11e6bb0650b497d97cdd' and status = '10' order by id limit 1,1;+----+--------+----------------------------------+| id | status | user_id |+----+--------+----------------------------------+| 2 | 10 | 24e568a88fae11e6bb0650b497d97cdd |+----+--------+----------------------------------+
方案二 — 一次性查询
SELECT *FROM (SELECT id, user_id, @rank:=IF(@current_user_id = user_id, @rank + 1, 1) rank, @current_user_id:=user_id FROM (SELECT @current_user_id:=NULL, @rank:=NULL) vars, t WHERE t.status = '10' ORDER BY user_id , id) aWHERE rank = 2; +----+----------------------------------+------+----------------------------------+| id | user_id | rank | @current_user_id:=user_id |+----+----------------------------------+------+----------------------------------+| 2 | 24e568a88fae11e6bb0650b497d97cdd | 2 | 24e568a88fae11e6bb0650b497d97cdd || 7 | e8669ac28fae11e6bb0650b497d97cdd | 2 | e8669ac28fae11e6bb0650b497d97cdd |
原理解释
先按user_id和id顺序排序, 然后从1开始分配序号,同一用户就递增,不同用户则重新从1开始。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1082249.html
微信扫一扫
支付宝扫一扫