MySql批处理的小窍门:排行榜类数据生成

最近在做新版本的开发,其中涉及到排行榜的批量预生成,在此分享给大家。

关键点

名次的计算(不考虑用游标)

单榜单查询

对于排行榜这种类型的数据,当只查一个排行榜时,由于数据量较少,我们可以直接查询后,在程序中生成名次(例如实时的只针对一个目的地下某类poi的好评榜)处理的时候php直接执行查询语句获取即可。

多榜单生成

但随着要生成的榜单数量增多,这种通过程序中转一次的方式,显然并不能令人满意,MySql中有没有一种方式,能够满足批量生成符合条件的排行榜时的名次批量生成吗?(例如:按特定要求生成排行榜,每个目的地下是否有排行榜,排行榜数量都不确定的情况)

如果能够生成名次列,我们就可以方便的通过INNER JOIN的方式将榜单成员记录和榜单的对应关系连起来。(这里就不赘述)

例子:多榜单的名次列生成

下面是一个批量生成分类型的排行榜(按评分score从高到低排序)

-- POI基础表
CREATE TABLE temp_poi
(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL, -- 名称
type_id VARCHAR(255) NOT NULL, -- 类型
score int NOT NULL, -- 评分
PRIMARY KEY(id)
); -- 生成测试数据
INSERT INTO temp_poi(name,type_id,score)
VALUES('a',1,75)
,('b',2,28)
,('c',1,77)
,('d',3,55)
,('e',2,88)
,('f',3,37)
,('g',1,49)
,('h',2,57)
,('i',1,63)
,('j',3,44)
; -- 生成带名次的榜单
SELECT
type_id
,id
,score
,@position := if(@previous = type_id, @position, 0) + 1 AS position
,@previous := type_id
FROM
temp_poi
, (SELECT @previous := -1, @position := 0) AS s -- 非常重要的一行
ORDER BY
type_id
,score DESC
;

特别注意

其中一行代码:

, (SELECT @previous := -1, @position := 0) AS s

如果缺失会导致非常隐蔽的错误:在首次连接MySql后的第一次运行时会导致排名计算出错(之后就正常了)

MySql批处理的小窍门:排行榜类数据生成的更多相关文章

  1. VAssistX使用小窍门

    日常使用中的一些VAssistX使用小窍门,简单总结下 一,修改VAssistX默认缓存文件路径,防止默认C盘被占用空间过大 1.  打开注册表HKCU\Software\Whole Tomato,新 ...

  2. 【干货】分享总结:MySQL数据一致性 罗小波 星辉天拓

    [干货]分享总结:MySQL数据一致性  罗小波  星辉天拓 http://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ==&mid=2653928966&a ...

  3. WPF中线性渐变画刷的一个小窍门

    最近被项目里面控件的设计搞的死去活来的,大部分的设计都会需要使用进度条的功能,因为UI形状的变态,使用ProgressBar不能满足需求,没办法就自己想办法实现进度显示.折腾的多了发现一个很不错的方法 ...

  4. 教你50招提升ASP.NET性能(二十四):ORM小窍门

    ORM TipsORM小窍门 More and more people are using Object to Relational Mapping (ORM) tools to jump the d ...

  5. 编程入门视频【 Python、PHP、ThinkPHP、Laravel、Mysql、微信小程序】

    免费分享 Python.PHP.ThinkPHP.Laravel.Mysql.微信小程序等学习视频 点击进入搜刮 免费分享 Python.PHP.ThinkPHP.Laravel.Mysql.微信小程 ...

  6. 【放松一下】北美小游戏排行榜TOP10——“点击英雄”

    大家平时工作都比較忙,在这里推荐一款游戏让大家放松一下.让你体验到指数爆炸般挣钱的快感. 北美小游戏排行榜TOP10--"点击英雄" 简要说明: 游戏能够挂机,关闭电脑.游戏也会自 ...

  7. 10个提升MySQL性能的小技巧

    从工作量分析到索引的三条规则,这些专家见解肯定会让您的MySQL服务器尖叫. 在所有的关系数据库中,MySQL已经被证明了完全是一头野兽,只要通知停止运行就绝对不会让你多等一秒钟,使你的应用置于困境之 ...

  8. JavaScript性能优化小窍门汇总(含实例)

    在众多语言中,JavaScript已经占有重要的一席之地,利用JavaScript我们可以做很多事情 , 应用广泛.在web应用项目中,需要大量JavaScript的代码,将来也会越来越多.但是由于J ...

  9. 10个实用的UX设计作品推销小窍门

    以下内容由Mockplus(摹客)团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 众所周知,产品用户体验很重要,即使是Google也知道这一点.但是,当真正涉及到UX 设计销 ...

随机推荐

  1. vue2.0 transition -- demo实践填坑

    前言 vue1.0版本和2.0版本的过渡系统改变还是蛮彻底的,具体请自行详看文档介绍:https://vuefe.cn/v2/guide/migration.html#过渡.在使用2.0版本做过渡效果 ...

  2. ubuntu 查看软件包版本以及软件包的源码

    aptitude show  xxx sudo apt-cache show autoconf setattr, getattr, setattr http://ju.outofmemory.cn/e ...

  3. .NET 知识

    1.读懂IL代码就这么简单 IL是.NET框架中中间语言(Intermediate Language)的缩写.使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编译出来的 ...

  4. Linux 结束进程

    一个进程由于以下5个原因中的一个终止 --main函数调用return; --调用exit函数--C语言库函数: --调用_exit函数--系统调用 --调用abort函数 --被一个信号终止.(ki ...

  5. VMWare安装苹果操作系统OS X

    项目要求做一些简单的苹果开发尝试,由于苹果的各种开发要求在Macintosh机上进行,可是项目不值得为一次简单的尝试付出过多的购机费,所以只能另辟蹊径,跟别人学学怎么在虚拟机里面搞: http://j ...

  6. android studio导jar包找不到类的解决方法

    今天更新了universal-image-loader-1.9.5.jar文件,studio死活找不到其中相关的类,上网百度试了很多办法,总算解决了,具体方法跟一篇老外的帖子的差不多,这里分享下. 解 ...

  7. Python类库下载

    https://sourceforge.net/projects/pywin32/files/pywin32/ WMI库的安装 下载 http://timgolden.me.uk/python/wmi ...

  8. <实训|第二天>掌握linux6.7中安装vmware、vmware安装linux发行版本以及遇到的问题最后libreoffice的安装

    期待已久的linux运维.oracle"培训班"终于开班了,我从已经开始长期四个半月的linux运维.oracle培训,每天白天我会好好学习,晚上回来我会努力更新教程,包括今天学到 ...

  9. 结合php ob函数理解缓冲机制

    对于一个刚刚入门的php程序员来说,php缓冲区是几乎透明的.在他们心目中,一个echo print_r 函数,数据便会‘嗖’的一声飞到浏览器上,显示出来.我也一直如此单纯地认为. 其实,在技术的世界 ...

  10. Redis入门学习(一)——安装配置

    最近马上要找实习了,听学长说他们公司里用了redis来解决缓存问题,在大三结束前来学习一下. 问:Redis是什么? 答:(官方)REmote DIctionary Server(Redis)是一个K ...