首页 > 数据库 >这些年写过的花式sql 第2句 统计用户返佣金排名

这些年写过的花式sql 第2句 统计用户返佣金排名

时间:2023-08-03 18:25:51浏览次数:43  
标签:uid money flow rebate num sql 佣金 order 花式

第2句 统计用户返佣金排名

继续欢迎批评指正建议 ^^

需求:

曾经的活动是购买订单返流量(日志在 flow_rebate_log),后来改成返佣金(日志在 money_rebate_log)。
现在需要 按照用户返佣金额排名,如果不存在金额,则按 返流量 排名。其他需要列出的字段:username(用户名 连接 users表获得),用户返佣金额,用户返佣金的订单数,用户返流量数,用户返流量的订单数

SELECT r.*,u.username,
       flow_order_num + money_order_num as order_num,flow_order_money + money_order_money as order_money
from
        (
            (
							SELECT f.uid,rebate_flow,flow_order_num,rebate_money,money_order_num,f.money as flow_order_money,m.money as money_order_money
								from
									(SELECT sum(rebate_value) as rebate_flow,count(*) as flow_order_num,uid,money FROM `flow_rebate_log` group by uid) f
									left join
									(SELECT sum(consume_money) as rebate_money,count(*) as money_order_num,uid,money FROM `money_rebate_log` group by uid) m 
									on m.uid = f.uid
						)
								
						union

						(
							SELECT m.uid,rebate_flow,flow_order_num,rebate_money,money_order_num,f.money as flow_order_money,m.money as money_order_money
							from
									(SELECT sum(rebate_value) as rebate_flow,count(*) as flow_order_num,uid,money FROM `flow_rebate_log`  group by uid ) f  
									right join
									(SELECT sum(consume_money) as rebate_money,count(*) as money_order_num,uid,money FROM `money_rebate_log`  group by uid) m 
									on m.uid = f.uid
						)
        ) r

left join 
`users` u
on u.id = r.uid

排序在php代码里,因为想利用 TP框架的分页功能返回给前端。

//$tb = "sql语句";
 $list = Db::table("($tb) t")
        ->order('rebate_money desc,rebate_value desc')
        ->limit(50)
        ->select();
解析:

因为有的用户 只出现在 flow_rebate_log,有的只出现在 money_rebate_log, 需要一个全连接。使得每条记录 同时 包含用户的返流量和返金额信息。 而mysql不支持full join,
只能用一个trick : m (money_rebate_log ) full join f(flow_rebate_log) 相当于

m left join f
union
m right join f

由于 f.uid 和 m.uid 连接后 可能会有一个值是空的,那我们要取 肯定有值的。所以先选取 有效列 再 union。
值得注意的是 union 和 union all 是有一点区别的,union 是去重的,union all是全部保留的。这里 每个用户只对应一条记录。所以 union 就可以了。

知识点:

模拟“full join” 和 union

标签:uid,money,flow,rebate,num,sql,佣金,order,花式
From: https://www.cnblogs.com/xjcyue/p/17604104.html

相关文章

  • w3c上关于 SQL LEFT JOIN 关键字 这一章的错误
    ================================摘自W3C================================SQLLEFTJOIN关键字LEFTJOIN关键字会从左表(table_name1)那里返回所有的行,即使在右表(table_name2)中没有匹配的行。LEFTJOIN关键字语法SELECTcolumn_name(s)FROMtable_name1LEFTJOIN......
  • SQL如何确保数据唯一性?
    SQL中的UNIQUE约束:确保数据唯一性的强大工具简介在SQL数据库中,UNIQUE约束是一种用于确保数据唯一性的重要工具。本文将深入探讨UNIQUE约束的概念、应用场景以及使用方法,以帮助读者更好地理解和利用UNIQUE约束来保证数据的一致性和准确性。UNIQUE约束在SQL数据库中,UNIQUE约束是一种......
  • SQL主键怎么使用,你会了吗?
    PrimaryKey的重要性和使用方法SQL主键(PrimaryKey)是关系数据库中的一个重要概念,它用于唯一标识表中的每一行数据,并确保数据的完整性和一致性。本文将介绍SQL主键的定义、作用以及在数据库设计和查询中的使用方法。PrimaryKey主键是一列或一组列,用于唯一标识表中的每一行数据。主......
  • mysql事务和索引详解
    mysql事务和索引详解1.事务注:事务就是一组操作的集合,成功一起成功,失败一起失败事务控制:开启事务:starttransaction;/begin;提交事务:commit;回滚事务:rollback;使用方法:首先graphTBid1[开启事务]-->id2{执行mysql}id2-->|语句全部执行成功|id3>提交事务]id2-->|语......
  • sqlserver没有足够的内存继续执行程序
      需求,导出的数据库表,数据生成的sql脚本很大运行sql脚本内存不足。 解决方法:一,通过sqlcmd工具来执行大的脚本1,用管理员身份打开命令行工具有些可能要进入到cdC:\ProgramFiles\MicrosoftSQLServer\100\Tools\Binn目录运行sqlcmd2,运行 sqlcmd-S.-Usa-P123......
  • MySQL Workbench的使用教程
    MySQLWorkbench 是MySQLAB最近释放的可视数据库设计工具。这个工具是设计MySQL数据库的专用工具。MySQLWorkbench拥有很多的功能和特性;这篇由DjoniDarmawikarta 写的文章通过一个示例展现了其中的一些。我们将针对一个订单系统建立一个物理数据模型,这里的订单系统可以......
  • 花式涵数编程
        1美人心计今日向大家介绍后花园中的3位美人,分别是命令氏、面向对象氏、函数氏。命令氏,妃,贤妻良母,夫唱妇随,和她在一起四字可形容,简单粗暴;面向对象氏,嫔,聪明伶俐,足智多谋,心眼一个接着一个,省了我不少事情;函数氏,贵人,零零后,八面玲珑,火星语乱飞,女孩的心思你别猜。她们国色天香......
  • 在MySQL中存储树状结构
        原文地址,原文中HierarchicalData直译为 分层结构,这里我翻译成 树状结构。补充资源:https://django-mptt.github.io/django-mptt/ ,如果你也使用python和django,这个是现成的APP。另外,个人觉得这种方法对于搜索的效率提升最大,而相应的新增、删除等操作则会变慢,个人猜测......
  • Windows7系统安装MySQL5.7.41
    1、下载MySQL5.7.41Windows版安装包  2.新增相关配置文件  解压开压缩包后目录如下(红圈框处没有),需要手动新建一个data文件夹和和一个txt文本-my,对文本进行编辑,写入如下图内容保存(打码处为该文件位置,如解压后文件夹名为mysql5.7放在D盘,则为D:\mysql-5.7)  3、配置......
  • mysql多表查询
    mysql多表查询1.内连接查询隐式内连接查询select*fromtable1,table2whereconditions;注:如果起别名,条件和查询的内容需要用别名来调用显示内连接查询select*fromtable1[inner]jointable2onconditions;2.外连接查询①左表外连接(左表中的全部数据)......