MYSQL查询X表中销量排名第X的数据
这里我们举个例子:查询订单明细表(order _detail)中销量(下单件数)排名第二的商品id,如果不存在返回null,如果存在多个排名第二的商品则需要全部返回。
案例表结构【1_order _detail】
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for 1_order_detail
-- ----------------------------
DROP TABLE IF EXISTS `1_order_detail`;
CREATE TABLE `1_order_detail` (
`order_detail_id` int(11) DEFAULT NULL,
`sku_num` int(11) DEFAULT NULL,
`price` int(11) DEFAULT NULL,
`sku_id` int(11) DEFAULT NULL,
`create_date` varchar(255) DEFAULT NULL,
`order_id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
SET FOREIGN_KEY_CHECKS = 1;
实现思路
首先根据商品id汇总得到每个商品的总销量,然后再通过窗口函数根据商品总销量去排序,这里选择的窗口函数是DENSE_RANK【这里考虑到了销量一样的也要查出来,其他还有RANK,ROW_NUMBER,根据自己的业务场景来选择】然后再根据排序的值去筛选就好了。
- RANK() 排序相同时会重复,总数不变,即会出现1、1、3这样的排序结果;
- DENSE_RANK() 排序相同时会重复,总数会减少,即会出现1、1、2这样的排序结果;
- ROW_NUMBER() 排序相同时不会重复,会根据顺序排序。
SELECT sku_id
FROM (
SELECT sku_id, DENSE_RANK() OVER (ORDER BY sales DESC) AS sales_rank
FROM (
SELECT sku_id, SUM(sku_num) AS sales
FROM 1_order_detail
GROUP BY sku_id
) AS t1
) AS t2
WHERE sales_rank = 2;
这里需要注意的点:窗口函数只有MYSQL8.0以上才能用!