MySQL 查询结果倒叙后分组(先order by,再按order by的结果group by)
mysql 查询 结果 by 分组 group order 倒叙
2023-06-13 09:16:29 时间
业务前提:用户下单,订单归属于指定销售,审核通过的订单可以参与计算业绩。
需求描述:统计向,统计销售成单情况,要求显示指定销售人员最近审核通过的订单。
解决方案:暂列举3种,各有利弊,权衡取舍。
方案1:按需要GROUP BY的关键字段简单查询出全部数据,然后在程序中再次过滤、倒叙、取首。
局限性:批量查询时,数据量不可控,范围越大,内存越可能扛不住,单次查询结果量可预估时酌情考虑,不确定的话不推荐。
方案2:子查询的ORDER BY配合LIMIT使用。
局限性:对数据量有预估要求(本需求中要求覆盖user_order全表数据,不适用,未选择该方案)。
核心SQL如下:
SELECT
temp.sale_asset_id,
temp.last_passed_order_id,
temp.last_passed_order_create_time
FROM
(
SELECT
check.auth_user_id,
uo.id last_passed_order_id,
uo.create_time last_passed_order_create_time
FROM
user_order uo
INNER JOIN user_order_check check ON check.order_id = uo.id AND check.id = uo.sale_qc_check_id
WHERE
check.check_status = 200
AND check.auth_user_id IN (1,2,3)
ORDER BY
check.auth_user_id,
check.check_time DESC,
uo.id DESC
LIMIT 99999999
) temp
GROUP BY
temp.auth_user_id;
方案3:使用MAX函数针对倒叙条件“审核时间”取最大值,模拟倒叙。
局限性:需要对可能导致查询结果中GROUP BY字段数据非唯一的情况做考虑(本需求要求查询结果中销售数据唯一,影响唯一的字段是check_time(大)、create_time(小),若还有其他字段,则需要再次关联MAX的结果),影响字段越多,则关联的子查询越多,降低性能。
核心SQL如下:
SELECT
check.auth_user_id,
uo.id last_passed_order_id,
uo.create_time last_passed_order_create_time
FROM
user_order uo
INNER JOIN user_order_check check ON check.order_id = uo.id AND check.id = uo.sale_qc_check_id
/* 相同销售,按审核通过时间,取最近 */
INNER JOIN (
SELECT
auth_user_id,
MAX(check_time) max_time
FROM
user_order_check
WHERE
check_status = 200
AND auth_user_id IN (1,2,3)
GROUP BY
auth_user_id
) max_result_time ON max_result_time.auth_user_id = check.auth_user_id AND max_result_time.max_time = check.check_time
/* 相同销售,相同审核通过时间,取最近生成的订单(此类情况不易出现,如产品不考虑此类情况,可不关联该部分,有助于提高性能) */
INNER JOIN (
SELECT
auth_user_id,
MAX(order_id) max_order_id
FROM
user_order_check
WHERE
check_status = 200
AND auth_user_id IN (1,2,3)
GROUP BY
auth_user_id,
check_time
) max_result_order ON max_result_order.auth_user_id = check.auth_user_id AND max_result_order.max_order_id = check.order_id;
另:建议额外搭配合适的索引使用。
相关文章
- mysql主键自增策略_MySQL 自增主键机制
- Mysql重置缓存:立即取得最新结果(mysql清空缓存)
- MySQL快速上手:基本操作命令指南(mysql基本操作命令)
- MySQL表被毁:悲剧重演(mysql表被覆盖)
- 简易步骤:利用C语言创建MySQL数据库(c创建mysql数据库)
- MySQL查询语句快速入门:25个关键字(mysql查询语句怎么写)
- 快速搭建Qt环境中的MySQL数据库(qt配置mysql数据库)
- MySQL中文查询语句不成功?尝试使用分隔符提高查询效率(mysql分隔符)
- MySQL数据库下使用HQL查询数据(hql mysql)
- MySQL使用详解:全面学习MYSQL技术(mysql大全)
- MySQL索引:提高查询效率的神手!(mysql 索引 是什么)
- MySQL中OR运算符的使用(mysql 中 or)
- MySQL数据库实现CSV格式文件的快速导入(csv传mysql数据库)
- 如何使用bat批处理快捷导入MYSQL(bat怎么导入mysql)
- MySQL查询中不等于的用法(7、mysql查询不等于)
- MySQL三表查询优化策略探究(mysql 三表)
- MySQL查询结果集的不同之处(mysql 不同结果集)
- MySQL多库查询技巧分享(mysql不同库数据查询)
- MySQL优化查询避免空列查询(mysql不查询空列)