登录
首页 >  数据库 >  MySQL

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

来源:SegmentFault

时间:2023-01-19 13:25:37 171浏览 收藏

本篇文章向大家介绍《如何得到Mysql每个分组中的第N条记录》,主要包括MySQL,具有一定的参考价值,需要的朋友可以参考一下。

问题背景

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

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

如何得到每个用户同一类目下第四单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 |
+----+--------+----------------------------------+

如何得到每个用户第二次成功支付(

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...

到这里,我们也就讲完了《如何得到Mysql每个分组中的第N条记录》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于mysql的知识点!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表