问题背景

1) 限制:每个用户在一个类目下,最多享受4单满送优惠。

即统计享受了满送优惠的订单数时需要排除掉同一类目下第四单以后的订单

如何得到每个用户同一类目下第四单ID呢?

select fourth(id) from order group by user_id, category;

可惜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')的订单呢?

方法一 -- 逐个查询

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_idFROM(SELECT @current_user_id:=NULL, @rank:=NULL) vars, tWHEREt.status = '10'ORDER BY user_id , id) a
WHERErank = 2;+----+----------------------------------+------+----------------------------------+
| id | user_id                          | rank | @current_user_id:=user_id        |
+----+----------------------------------+------+----------------------------------+
|  2 | 24e568a88fae11e6bb0650b497d97cdd |    2 | 24e568a88fae11e6bb0650b497d97cdd |
|  7 | e8669ac28fae11e6bb0650b497d97cdd |    2 | e8669ac28fae11e6bb0650b497d97cdd |

原理解释

先按user_id和id顺序排序, 然后从1开始分配序号,同一用户就递增,不同用户则重新从1开始。

在线体验

http://sqlfiddle.com/#!9/ca126b/1

参考文档

http://www.developerfiles.com...

如何得到Mysql每个分组中的第N条记录相关推荐

  1. mysql 分组top_MySQL:如何查询出每个分组中的 top n 条记录?

    问题描述 需求: 查询出每月 order_amount(订单金额) 排行前3的记录. 例如对于2019-02,查询结果中就应该是这3条: 解决方法 MySQL 5.7 和 MySQL 8.0 有不同的 ...

  2. 查询出每个分组中的 top n 条记录

    问题描述 需求: 查询出每月 order_amount(订单金额) 排行前3的记录. 例如对于2019-02,查询结果中就应该是这3条: 解决方法 MySQL 5.7 和 MySQL 8.0 有不同的 ...

  3. mysql 分组取最新的一条记录(整条记录)

    方法:mysql取分组后最新的一条记录,下面两种方法.一种是先筛选 出最大和最新的时间,在连表查询.一种是先排序,然后在次分组查询(默认第一条),就是最新的一条数据了 #select * from t ...

  4. MySQL数据库中如何查询分组后每组中的最后一条记录

    MySQL数据库中如何查询分组后每组中的最后一条记录 方法一 select * from messages where id in (select max(id)fom messages group ...

  5. 检索每个组中的最后一条记录-MySQL

    有一个表messages ,其中包含数据,如下所示: Id Name Other_Columns ------------------------- 1 A A_data_1 2 A A_data_2 ...

  6. mysql获取删除的条数_如何从mysql表中删除数百万条记录而不会减速

    有没有一种很好的方法来删除很多记录而不会减慢网站的速度? 我需要从没有索引和主键的MySQL表中删除数百万条记录.我阅读了SO和网上的各种教程,基本策略是限制删除查询,在删除之间休眠一两秒钟,然后重复 ...

  7. mysql 分组排序取前n_mysql分组排序取前N条记录的最简洁的单条sql ! | 学步园

    -- mysql分组排序取前N条记录的最简洁的单条sql. use test; drop table if exists test; create table test ( id int primar ...

  8. MYSQL学习:GROUP BY分组取最新的一条记录

    日常开发当中,经常会遇到查询分组数据中最新的一条记录,比如统计当前系统每个人的最新登录记录.外卖系统统计所有买家最新的一次订单记录.图书管理系统借阅者最新借阅书籍的记录等等.今天给大家介绍一下如何实现 ...

  9. 如何获取mongodb中的最后N条记录?

    我找不到任何记录在案的文件. 默认情况下,find()操作将从头开始获取记录. 如何获取mongodb中的最后N条记录? 编辑:我也希望返回的结果从最近到最近排序,而不是相反. #1楼 您可以使用so ...

最新文章

  1. R语言window函数提取时序数据数据子集(subset):使用xts包将dataframe数据转化为时间序列数据(time series)、使用window函数从时间序列对象中提取数据子集
  2. 2017,公司必须换掉的六种人,别心软!
  3. 用 XStream 序列化/反序列化 XML 为 Java 对象(实例)
  4. Android LinearLayout的android:layout_weight属性
  5. 网络连接、路由配置等
  6. 围观窗体与组件01 - 零基础入门学习Delphi23
  7. 洛谷P1202 [USACO1.1]黑色星期五Friday the Thirteenth
  8. NSThread创建线程的三种方法
  9. 创建一个html网页,创建第一个HTML网页(未完待续)
  10. 如何打造智能化的员工出行方式?阿里自研出行神器首次曝光
  11. Scala教程之:PartialFunction
  12. 《编程原本 》一3.3 程序变换
  13. 【毕业设计】一种多商家网络商店的设计与实现(源代码+论文)
  14. 【翠花学Vue】每日打卡——vue打卡1
  15. 手Q支付Android开发面试前小记
  16. java三层结构小节
  17. NISP一级知识点学习笔记总结
  18. 与时间和频率测量有关的一些重要概念(抖动,游走,MTIE、TDEV)
  19. 趣味三角——第2章——弦
  20. c 数组上限_深度文章,高手必看:C编程表驱动法编程实践(精华帖,建议收藏并实践)...

热门文章

  1. thinkphp 调用php文件上传,ThinkPHP实现带验证码的文件上传功能实例
  2. python java web_Python 与 Java 使用 websocket 通信
  3. Java学习总结:23
  4. fedora mysql默认密码忘记_Linux fedora 24 忘记密码图形化界面修改root密码的方法
  5. Java项目:银行管理系统+文档Java基础Gui(java+Gui)
  6. c语言编程题餐饮服务打分,求详细分析C语言题餐饮服务质量调查打分题和答案..._质量员考试_帮考网...
  7. 根据传入坐标和图片URL地址对图片进行切图操作、将图片转化成Base64位码
  8. 仅需6步,教你轻易撕掉app开发框架的神秘面纱(5):数据持久化
  9. mpvue 转uniapp 导航栏样式错乱问题修复 tabbar 样式修复
  10. Memcached, Redis, MongoDB区别