如何通过单条MySQL查询获取80条降序+20条升序的tbl_emails记录?
单条SQL实现混合排序的结果获取
当然可以用单条SQL完成这个需求,核心思路是用UNION ALL分别筛选两类数据后合并,具体写法如下:
SELECT id, email FROM tbl_emails ORDER BY id DESC LIMIT 80 UNION ALL SELECT id, email FROM tbl_emails ORDER BY id ASC LIMIT 20;
关键细节说明:
- 优先用
UNION ALL而非UNION:UNION会自动做去重和全局排序,完全没必要且额外消耗性能;UNION ALL只是简单合并两个结果集,保留各自子查询的顺序,效率更高。 - 子查询的逻辑:每个子查询通过
ORDER BY+LIMIT精准筛选出80条最新(id降序)和20条最早(id升序)的记录,合并后结果会先展示80条降序数据,再展示20条升序数据。 - 兼容性:这个写法在MySQL、PostgreSQL、SQLite等主流关系型数据库中都能正常运行,无需额外调整。
如果需要让合并后的整体结果按其他规则排序,可以在外层套一层查询,比如:
SELECT * FROM ( SELECT id, email FROM tbl_emails ORDER BY id DESC LIMIT 80 UNION ALL SELECT id, email FROM tbl_emails ORDER BY id ASC LIMIT 20 ) AS combined ORDER BY id DESC; -- 可根据需求修改整体排序逻辑
内容的提问来源于stack exchange,提问作者Manisha
相关产品推荐
相关产品推荐

