经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » SQL语言 » 查看文章
这些年写过的花式sql 第2句 统计用户返佣金排名
来源:cnblogs  作者:逆风向阳  时间:2023/8/4 9:02:22  对本文有异议

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

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

需求:

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

  1. SELECT r.*,u.username,
  2. flow_order_num + money_order_num as order_num,flow_order_money + money_order_money as order_money
  3. from
  4. (
  5. (
  6. 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
  7. from
  8. (SELECT sum(rebate_value) as rebate_flow,count(*) as flow_order_num,uid,money FROM `flow_rebate_log` group by uid) f
  9. left join
  10. (SELECT sum(consume_money) as rebate_money,count(*) as money_order_num,uid,money FROM `money_rebate_log` group by uid) m
  11. on m.uid = f.uid
  12. )
  13. union
  14. (
  15. 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
  16. from
  17. (SELECT sum(rebate_value) as rebate_flow,count(*) as flow_order_num,uid,money FROM `flow_rebate_log` group by uid ) f
  18. right join
  19. (SELECT sum(consume_money) as rebate_money,count(*) as money_order_num,uid,money FROM `money_rebate_log` group by uid) m
  20. on m.uid = f.uid
  21. )
  22. ) r
  23. left join
  24. `users` u
  25. on u.id = r.uid

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

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

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

  1. m left join f
  2. union
  3. m right join f

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

知识点:

模拟“full join” 和 union

原文链接:https://www.cnblogs.com/xjcyue/p/17604104.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号