博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sql 分组查询前N名
阅读量:6368 次
发布时间:2019-06-23

本文共 2960 字,大约阅读时间需要 9 分钟。

分组查询前十名

表结构

CREATE TABLE `tb_api_app_income_rank` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `product_id` varchar(64) DEFAULT '',  `product_name` varchar(255) DEFAULT NULL,  `publisher_id` varchar(64) DEFAULT NULL,  `publisher_name` varchar(512) DEFAULT NULL,  `company_id` varchar(64) DEFAULT NULL,  `company_name` varchar(512) DEFAULT NULL,  `category` varchar(64) DEFAULT NULL COMMENT '分类',  `rank_type` varchar(32) DEFAULT NULL COMMENT '排行榜类型,0:免费,1:付费,2:畅销',  `country` varchar(32) DEFAULT NULL,  `rank` int(11) DEFAULT NULL COMMENT '在收入下载量排行榜的排名',  `change_rank` int(11) DEFAULT NULL,  `change_percent` decimal(11,6) DEFAULT NULL,  `change_value` int(11) DEFAULT NULL,  `price` decimal(11,2) DEFAULT NULL,  `estimate` int(11) DEFAULT NULL,  `downloads` int(11) DEFAULT NULL COMMENT '下载量',  `income` int(11) DEFAULT NULL COMMENT '收入',  `release_date` varchar(32) DEFAULT NULL,  `is_new` int(11) DEFAULT '0' COMMENT '是否新品,0:不是,1:是。新品:距离当前时间往前推7天(昨日为第7日),release date在这7天之内,且该产品的appid是首次出现,才算做新品',  `created_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',  `updated_at` datetime DEFAULT NULL,  PRIMARY KEY (`id`,`created_at`),  KEY `idx_apir_update_time` (`updated_at`) USING BTREE,  KEY `idx_apir_ctime_country` (`country`,`created_at`) USING BTREE,  KEY `idx_apir_aid` (`product_id`)) ENGINE=InnoDB AUTO_INCREMENT=52188 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='app 收入下载量的排行榜,分免费、付费、畅销排行榜'
  1. 第一种方案
SELECT    t1.*FROM    tb_api_app_income_rank t1WHERE    created_at = '2017-11-07 00:00:00'AND rank_type = 'grossing'AND change_rank = 1000AND (    SELECT        count(1)    FROM        tb_api_app_income_rank    WHERE        rank_type = 'grossing'    AND change_rank = 1000    AND created_at = '2017-11-07 00:00:00'    AND country = t1.country    AND category = t1.category    AND rank < t1.rank) < 3;

消耗时间: 7.260s

  1. 第二种方案
SELECT    t1.*FROM    tb_api_app_income_rank t1left join  tb_api_app_income_rank t2 ON t2.created_at = '2017-11-07 00:00:00'AND t2.rank_type = 'grossing'AND t2.change_rank = 1000AND t1.country = t2.countryAND t1.category = t2.categoryAND t1.rank > t2.rankwhere t1.created_at = '2017-11-07 00:00:00'AND t1.rank_type = 'grossing'AND t1.change_rank = 1000group by t1.country, t1.category, t1.product_idhaving count(t1.product_id)<3order by t1.country, t1.category,rank;

消耗时间: 8.076s

  1. 第三种
select * from (SELECT    (        @i := CASE        WHEN @pre_country = country && @pre_category = category THEN            @i + 1        ELSE            1        END    ) rownum,    t1.*, (@pre_country := country), (@pre_category := category)FROM    tb_api_app_income_rank t1,    (        SELECT            @i := 0,            @pre_country := '',            @pre_category := ''    ) AS tmpWHERE    created_at = '2017-11-07 00:00:00'AND rank_type = 'grossing'AND change_rank = 1000ORDER BY    country,    category,    rank) t2 where t2.rownum <=3

消耗时间: 0.113s

由上得出结论,使用游标而不是连表或嵌套子查询,速度快翻几千倍

参考资料

转载于:https://www.cnblogs.com/xunux/p/7808814.html

你可能感兴趣的文章
Python 比特币教程之二: 机器人收发比特币
查看>>
虎牙直播在微服务改造方面的实践和总结
查看>>
怎样将优酷网站下载的视频KUX转MP4格式
查看>>
MongoDB 分组统计
查看>>
二进制状态码
查看>>
Vue 中 CSS 动画原理
查看>>
关于 Promise 的 9 个提示
查看>>
算法复习
查看>>
安卓中高级开发面试知识点之——缓存
查看>>
Java的初始化顺序
查看>>
js 判断回文字符串
查看>>
shields小徽章是如何生成的?以及搭建自己的shield服务器
查看>>
猫头鹰的深夜翻译:spring事务管理
查看>>
记一次使用Spring REST Docs + travis + github自动生成API接口文档的操作步骤(下)...
查看>>
1、集合 2、Iterator迭代器 3、增强for循环 4、泛型
查看>>
关于/var/run/docker.sock
查看>>
SCrapy爬虫大战京东商城
查看>>
用 JavaScript 实现链表操作 - 11 Alternating Split
查看>>
Laravel优秀扩展包整理
查看>>
日志分析之识别真假蜘蛛与处理办法
查看>>