博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL给查询结果添加一表表示行号或名次(2)
阅读量:6745 次
发布时间:2019-06-25

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

hot3.png

给关联查询结果添加一列表示名次(order_no)和行号(row_no),并查询出指定条件记录

需求信息

在捐赠和报名系统里,用户直接捐赠和报名的费用都会捐赠给用户指定的慈善机构。但,每个用户只有第一笔捐赠记录会累计到慈善积分,之后的捐赠不算做慈善积分。在系统里为慈善机构有个慈善积分排行榜,每个捐赠/报名用户可以在慈善机构排行榜上看到自己、自己邀请来的好友和前20名用户的慈善积分。

慈善积分公式:用户自己的第一笔捐赠+好友的所有捐赠+好友人数*35

数据库表结构

  qw_zoetis_donate 报名/捐赠信息  
字段名 中文名 字段类型 备注说明
id 表主键 integer 自动增长
user_id 用户ID integer  
donate_price 直接捐赠金额 decimal  
enroll_price 报名金额 decimal  
total_price 总捐赠金额 decimal 等于donate_price+enroll_price
donate_unit 捐赠机构ID integer  
city_id 报名城市ID integer  
pay_status 支付状态 string  
pay_time 支付时间 integer  
order_no 捐赠订单编号 string  
entry_no 报名编号 string  
created_time 创建时间 integer  
updated_time 更新时间 integer  
inviter_id 邀请用户ID integer  
is_active 是否累计到自己的总捐赠金额 boolean 每个用户只有第一笔捐赠值为true
       
       
  qw_zoetis_user 用户捐赠金额  
字段名 中文名 字段类型 备注说明
id 活动ID integer 自动增长
user_id 活动期间用户能够参与的次数限制 string  
donate_unit     用户is_active=1那条记录的donate_unit
total_price     自己is_active=ture和邀请来好友所用有捐赠金额之合
created_time 创建时间 integer  
updated_time 更新时间 integer  

实例分析

因为要在慈善机构排行榜上看到自己、自己邀请来的用户和前20名用户的慈善积分。因为:1,以上这些条件的查询结果结构相同;2,为避免查询当前用户和邀请好友的慈善积分和名次时出现N+1次查询。所以我们使用嵌套语句一次查询出满足所有条件的记录。

查询语句

假如我们已经先查出当前用户和好友的ID是(7, 29087, 29089, 29097)

SELECT *FROM (	SELECT user_id, total_price, invited_user_count, user_score,	@current_score AS before_score,	@row_no:=@row_no+1 AS row_no, 	CASE WHEN @current_score <> user_score THEN @score_no:=@row_no ELSE @score_no:=@score_no END AS user_score_no	, @current_score := user_score AS after_score	FROM (		SELECT qw_zoetis_user.user_id, qw_zoetis_user.total_price,		qw_zoetis_user.updated_time, 		COUNT(DISTINCT qw_zoetis_donate.user_id) AS invited_user_count, 		IF(COUNT(DISTINCT qw_zoetis_donate.user_id) IS NOT NULL, COUNT(DISTINCT qw_zoetis_donate.user_id)*35, 0)+qw_zoetis_user.total_price AS user_score		FROM qw_zoetis_user		LEFT JOIN qw_zoetis_donate ON qw_zoetis_donate.inviter_id=qw_zoetis_user.user_id AND qw_zoetis_donate.pay_status='success'		WHERE qw_zoetis_user.donate_unit>=0		GROUP BY qw_zoetis_user.user_id	) t1	ORDER BY user_score DESC, updated_time ASC)t2WHERE row_no<=20 OR user_id IN (7, 29087, 29089, 29097);

查询结果截图

 

素材文件:链接: https://pan.baidu.com/s/1bpEJ82F 密码: ktfs

转载于:https://my.oschina.net/laifuzi/blog/861271

你可能感兴趣的文章
Linux负载均衡软件LVS之二(安装篇)
查看>>
hadoop中slot简介(map slot 和 reduce slot)
查看>>
集合框架(集合的使用步骤图解)
查看>>
不是做互联网的都会做移动互联网及移动客户端
查看>>
销售工程师招聘
查看>>
ASP.NET页面间POST和GET传值
查看>>
WPF-13:资源文件需要手动引用问题
查看>>
linux系统磁盘分区
查看>>
生产数据库的安全管理“白名单”
查看>>
Java数据类型和MySql数据类型对应表
查看>>
使用Travis CI自动部署Hexo到GitHub
查看>>
我的友情链接
查看>>
用Java写算法之六:希尔排序
查看>>
Nginx负载均衡初步搭建
查看>>
职场技巧1
查看>>
iOS-UIView-生命周期
查看>>
ubuntu单机下安装多mysql 5.7.14
查看>>
实现 CSRF 攻击简单示例
查看>>
C# 如何实现简单的Socket通信(附示例)
查看>>
oracle中merge into..using..on..when..when..用法
查看>>