mysql 取每组前N条记录

假设现在有一组数据,如下图所示。

extend_id out_id sort_order 排序,越小越靠前
1 20 255
2 80 255
3 20 253
4 80 253
5 20 252
6 80 252
7 80 254
8 20 254
9 20 3
10 20 3
11 20 4
12 20 3

方法1:用子查询:

SELECT * 

FROM uploaded_extend a 

WHERE (
    SELECT count(*) 
    FROM uploaded_extend b 
    WHERE b.out_id=a.out_id AND b.sort_order < a.sort_order
) < 3 

ORDER BY a.out_id DESC,a.sort_order ASC,a.extend_id DESC

解析:
Mysql执行顺序:
1.FROM uploaded_extend b 
2.WHERE ... 
3.SELECT * 
4.ORDER BY a.out_id DESC,a.sort_order ASC,a.extend_id DESC
子查询同上


数据匹配过程:
a.extend_id = 1时,子查询返回7。
a.extend_id = 2时,子查询返回3。
a.extend_id = 3时,子查询返回5。
a.extend_id = 4时,子查询返回2,2<3符合条件,加入结果集。
a.extend_id = 5时,子查询返回5。
a.extend_id = 6时,子查询返回1,1<3符合条件,加入结果集。
..... 此处省略.....

方法2:用左链接:

SELECT a.*

FROM uploaded_extend a 

LEFT JOIN uploaded_extend b ON b.out_id = a.out_id AND b.sort_order < a.sort_order 

GROUP BY a.extend_id,a.out_id 

having count(b.extend_id)<3 

ORDER BY a.out_id DESC,a.sort_order ASC,a.extend_id DESC

方法3:用exists半连接:

SELECT * FROM `uploaded_extend` a  
WHERE EXISTS
    (
        SELECT COUNT(*) 
        FROM `uploaded_extend` b 
        WHERE b.out_id=a.out_id AND b.sort_order < a.sort_order 
        HAVING COUNT(*)<3
    )
ORDER BY a.out_id DESC,a.sort_order ASC,a.extend_id DESC

结果返回:

extend_id out_id sort_order
6 80 252
4 80 253
7 80 254
12 20 3
10 20 3
9 20 3
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,839评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,253评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,503评论 25 709
  • 2017.11.14第14篇 星期二 晴 今天我休息去医院,早上还得早早的起床,早去早回,老时间叫起儿子,嘱...
    鑫隆妈妈阅读 236评论 0 0
  • 我想有个这样的地方 噙上两三口小酒 吹着风 就这样陶醉着,陶醉着…… 我想有个这样的地方 踩在亮晶晶的细沙子上 摆...
    少年气兮阅读 336评论 1 3