MySQL给查询结果添加一表表示行号或名次(2)

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

需求信息

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

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

数据库表结构

 qw_zoetis_donate报名/捐赠信息 
字段名中文名字段类型备注说明
id表主键integer自动增长
user_id用户IDinteger 
donate_price直接捐赠金额decimal 
enroll_price报名金额decimal 
total_price总捐赠金额decimal等于donate_price+enroll_price
donate_unit捐赠机构IDinteger 
city_id报名城市IDinteger 
pay_status支付状态string 
pay_time支付时间integer 
order_no捐赠订单编号string 
entry_no报名编号string 
created_time创建时间integer 
updated_time更新时间integer 
inviter_id邀请用户IDinteger 
is_active是否累计到自己的总捐赠金额boolean每个用户只有第一笔捐赠值为true
    
    
 qw_zoetis_user用户捐赠金额 
字段名中文名字段类型备注说明
id活动IDinteger自动增长
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
)t2
WHERE 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值