资讯专栏INFORMATION COLUMN

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

Scorpion / 2478人阅读

摘要:即统计享受了满送优惠的订单数时需要排除掉同一类目下第四单以后的订单如何得到每个用户同一类目下第四单呢可惜并没有分组函数可以方便的得到每组中第四个。

问题背景

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_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开始。

在线体验

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

参考文档

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/46818.html

相关文章

  • 如何写优雅的SQL原生语句?

    摘要:如果应用了,那么后面的所有步骤都只能操作的列或者是执行聚合函数等。注意原因在于分组后最终的结果集中只包含每个组中的一行。等聚合函数聚合函数只是对分组的结果进行一些处理,拿到某些想要的聚合值,例如求和,统计数量等,并不生成虚拟表。 前言: 上一篇讲Mysql基本架构时,以sql查询语句在MySql架构中具体是怎么执行的?进行了全面的讲解。知道了sql查询语句在MySql架构中的具体执行流...

    marser 评论0 收藏0
  • 如何写优雅的SQL原生语句?

    摘要:如果应用了,那么后面的所有步骤都只能操作的列或者是执行聚合函数等。注意原因在于分组后最终的结果集中只包含每个组中的一行。等聚合函数聚合函数只是对分组的结果进行一些处理,拿到某些想要的聚合值,例如求和,统计数量等,并不生成虚拟表。 前言: 上一篇讲Mysql基本架构时,以sql查询语句在MySql架构中具体是怎么执行的?进行了全面的讲解。知道了sql查询语句在MySql架构中的具体执行流...

    nihao 评论0 收藏0
  • 如何写优雅的SQL原生语句?

    摘要:如果应用了,那么后面的所有步骤都只能操作的列或者是执行聚合函数等。注意原因在于分组后最终的结果集中只包含每个组中的一行。等聚合函数聚合函数只是对分组的结果进行一些处理,拿到某些想要的聚合值,例如求和,统计数量等,并不生成虚拟表。 前言: 上一篇讲Mysql基本架构时,以sql查询语句在MySql架构中具体是怎么执行的?进行了全面的讲解。知道了sql查询语句在MySql架构中的具体执行流...

    bitkylin 评论0 收藏0
  • 如何写优雅的SQL原生语句?

    摘要:如果应用了,那么后面的所有步骤都只能操作的列或者是执行聚合函数等。注意原因在于分组后最终的结果集中只包含每个组中的一行。等聚合函数聚合函数只是对分组的结果进行一些处理,拿到某些想要的聚合值,例如求和,统计数量等,并不生成虚拟表。 前言: 上一篇讲Mysql基本架构时,以sql查询语句在MySql架构中具体是怎么执行的?进行了全面的讲解。知道了sql查询语句在MySql架构中的具体执行流...

    wind3110991 评论0 收藏0
  • Mysql调优之explain执行计划详解

    摘要:中无法利用索引完成的排序操作称为文件排序。子句的值总是,不能用来获取任何元组在没有子句的情况下,基于索引优化操作或者对于存储引擎优化操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。 前言 explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 使用方法,在select语句前加上explain就可以...

    singerye 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<