• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > 如何得到Mysql每个分组中的第N条记录

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

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-05

匿名通过本文主要向大家介绍了Mysql等相关知识,希望本文的分享对您有所帮助

问题背景

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

QQ图片20161122092324.png

方法一 -- 逐个查询

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) a
WHERE
    rank = 2;
    
+----+----------------------------------+------+----------------------------------+
| id | user_id                          | rank | @current_user_id:=user_id        |
+----+----------------------------------+------+----------------------------------+
|  2 | 24e568a88fae11e6bb0650b497d97cdd |    2 | 24e568a88fae11e6bb0650b497d97cdd |
|  7 | e8669ac28fae11e6bb0650b497d97cdd |    2 | e8669ac28fae11e6bb0650b497d97cdd |

原理解释

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

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-11Mysql在debian系统中不能插入中文的终极解决方案
  • 2017-05-11mysql like查询字符串示例语句
  • 2018-12-05如何理解spring事务及声明式事务的使用
  • 2017-05-11内网ssh/mysql登录缓慢的解决方法
  • 2018-12-05MySQL性能优化
  • 2017-05-11从MySQL复制功能中得到的一举三得实惠分析
  • 2018-12-05mysql 按照时间段来获取数据的方法
  • 2018-12-05SQLServer Execpt和not in 性能区别
  • 2017-05-11windows7下启动mysql服务出现服务名无效的原因及解决方法
  • 2018-12-05oracle 存储过程和触发器复制数据

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • mysql 常用命令集锦[绝对精华]
    • 关于SSE的10篇文章推荐
    • 中文Access2000速成教程--1.6 定义“主键”
    • mysql中mydumper 和 mysqldump对比使用详解
    • mysql 协议的server状态标识的代码详情
    • mysql重装后出现乱码设置为utf8可解决
    • 对于mysql优化方法你知道多少
    • Linux系统下mysqlcheck修复数据库命令
    • mysql出现Error performing load command的解决方法
    • MYSQL使用inner join 进行 查询/删除/修改示例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有