01用户列表.sql 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. -- Active: xiaoding_test@@192.168.110.85@3306
  2. WITH
  3. user_base AS (
  4. -- 基础用户信息
  5. SELECT
  6. id AS user_id,
  7. nickname,
  8. created_at AS register_time,
  9. deleted_at AS logout_time,
  10. mobile AS contact,
  11. last_login_time,
  12. invite_code,
  13. qrcode,
  14. avatar,
  15. state AS user_status
  16. FROM member_users
  17. WHERE
  18. deleted_at IS NULL
  19. ),
  20. user_address AS (
  21. -- 用户默认地址信息
  22. SELECT
  23. user_id,
  24. location AS user_location,
  25. province,
  26. city,
  27. district
  28. FROM member_address
  29. WHERE
  30. is_default = 'YES'
  31. ),
  32. user_wallet AS (
  33. -- 用户钱包信息
  34. SELECT
  35. owner_id AS user_id,
  36. available_balance AS wallet_balance
  37. FROM wallet
  38. WHERE
  39. owner_type = 'USER'
  40. ),
  41. user_order_stats AS (
  42. -- 近3个月订单统计
  43. SELECT
  44. user_id,
  45. COUNT(DISTINCT id) AS order_count,
  46. COALESCE(AVG(total_amount), 0) AS avg_order_amount
  47. FROM `order`
  48. WHERE
  49. created_at >= DATE_SUB(CURDATE(), INTERVAL 3 MONTH)
  50. GROUP BY
  51. user_id
  52. ),
  53. user_violation_stats AS (
  54. -- 近3个月违规统计
  55. SELECT user_id, COUNT(DISTINCT id) AS violation_count
  56. FROM violation_records
  57. WHERE
  58. created_at >= DATE_SUB(CURDATE(), INTERVAL 3 MONTH)
  59. GROUP BY
  60. user_id
  61. ),
  62. user_inviters AS (
  63. -- 用户邀请人信息
  64. SELECT
  65. t1.user_id,
  66. l1.nickname AS level1_inviter,
  67. l2.nickname AS level2_inviter
  68. FROM
  69. market_dist_teams t1
  70. LEFT JOIN member_users l1 ON l1.id = t1.object_id
  71. AND t1.level = 'LEVEL_1'
  72. LEFT JOIN market_dist_teams t2 ON t2.user_id = t1.user_id
  73. AND t2.level = 'LEVEL_2'
  74. LEFT JOIN member_users l2 ON l2.id = t2.object_id
  75. )
  76. -- 最终查询
  77. SELECT
  78. ub.*,
  79. ua.user_location,
  80. ua.province,
  81. ua.city,
  82. ua.district,
  83. uw.wallet_balance,
  84. COALESCE(uos.order_count, 0) AS order_count,
  85. COALESCE(uvs.violation_count, 0) AS violation_count,
  86. COALESCE(uos.avg_order_amount, 0) AS avg_order_amount,
  87. ui.level1_inviter,
  88. ui.level2_inviter
  89. FROM
  90. user_base ub
  91. LEFT JOIN user_address ua ON ua.user_id = ub.user_id
  92. LEFT JOIN user_wallet uw ON uw.user_id = ub.user_id
  93. LEFT JOIN user_order_stats uos ON uos.user_id = ub.user_id
  94. LEFT JOIN user_violation_stats uvs ON uvs.user_id = ub.user_id
  95. LEFT JOIN user_inviters ui ON ui.user_id = ub.user_id
  96. ORDER BY ub.register_time DESC
  97. LIMIT 20;
  98. /* 新的用户列表 2025-01-01 */
  99. use xiaoding_dev;
  100. DROP VIEW IF EXISTS v_member_list;
  101. CREATE OR REPLACE VIEW v_member_list AS
  102. SELECT
  103. mu.id AS id,/* 用户ID */
  104. mu.nickname AS nickname,/* 用户昵称 */
  105. mu.avatar AS avatar,/* 头像 */
  106. mu.mobile AS mobile,/* 联系方式 */
  107. mu.state AS state,/* 用户状态 */
  108. mu.last_login_time AS last_login_time,/* 最近登录时间 */
  109. mu.invite_code AS invite_code,/* 邀请码 */
  110. mu.qrcode AS qrcode,/* 二维码 */
  111. mu.created_at AS register_time,/* 注册时间 */
  112. mu.deleted_at AS logout_time,/* 注销时间 */
  113. mu.register_area AS register_area,/* 注册地区 */
  114. w.id AS wallet_id,/* 钱包ID */
  115. w.total_balance AS total_balance,/* 总余额 */
  116. w.available_balance AS wallet_balance,/* 可用余额 */
  117. w.frozen_amount AS frozen_amount,/* 冻结余额 */
  118. w.total_income AS total_income,/* 累计收入 */
  119. w.total_expense AS total_expense,/* 累计支出 */
  120. COALESCE(wwr.total_withdraw, 0) AS total_withdraw, /* 累计提现金额 */
  121. /* 订单统计 */
  122. COALESCE(o.order_count, 0) AS order_count, /* 下单次数 */
  123. COALESCE(o.overtime_count, 0) AS overtime_count, /* 加钟次数 */
  124. COALESCE(o.reward_count, 0) AS reward_count, /* 打赏次数 */
  125. COALESCE(o.total_amount, 0) AS total_amount, /* 累计消费金额 */
  126. COALESCE(o.overtime_amount, 0) AS overtime_amount, /* 加钟消费金额 */
  127. COALESCE(o.tip_amount, 0) AS tip_amount, /* 打赏消费金额 */
  128. COALESCE(o.order_amount, 0) AS order_amount, /* 订单消费金额 */
  129. COALESCE(ROUND(o.total_amount / NULLIF(o.order_count, 0), 2), 0) AS avg_amount, /* 平均消费金额 */
  130. COALESCE(vr.violation_count, 0) AS violation_count, /* 不良行为次数 */
  131. /* 一级邀请人 */
  132. CASE
  133. WHEN mdt1.object_type = 'App\\Models\\CoachUser' THEN ci1.nickname
  134. WHEN mdt1.object_type = 'App\\Models\\MemberUser' THEN mu1.nickname
  135. END AS inviter_level1_name,
  136. /* 二级邀请人 */
  137. CASE
  138. WHEN mdt2.object_type = 'App\\Models\\CoachUser' THEN ci2.nickname
  139. WHEN mdt2.object_type = 'App\\Models\\MemberUser' THEN mu2.nickname
  140. END AS inviter_level2_name
  141. FROM member_users mu
  142. LEFT JOIN wallet w ON w.owner_id = mu.id AND w.owner_type = 'App\\Models\\MemberUser'
  143. LEFT JOIN (
  144. SELECT w.owner_id, SUM(wwr.amount) as total_withdraw
  145. FROM wallet_withdraw_records wwr
  146. LEFT JOIN wallet w ON w.id = wwr.wallet_id
  147. WHERE wwr.state = 2 AND w.owner_type = 'App\\Models\\MemberUser'
  148. GROUP BY w.owner_id
  149. ) wwr ON wwr.owner_id = mu.id
  150. LEFT JOIN (
  151. SELECT
  152. user_id,
  153. COUNT(CASE WHEN type != 3 AND state = 12 THEN 1 END) as order_count,/* 订单次数 */
  154. COUNT(CASE WHEN type = 3 AND state = 12 THEN 1 END) as overtime_count,/* 加钟次数 */
  155. COUNT(CASE WHEN tip_amount IS NOT NULL AND tip_amount > 0 AND state = 12 THEN 1 END) as reward_count,/* 打赏次数 */
  156. SUM(CASE WHEN state = 12 THEN pay_amount + balance_amount ELSE 0 END) as total_amount,/* 总消费金额 */
  157. SUM(CASE WHEN type = 3 AND state = 12 THEN pay_amount + balance_amount ELSE 0 END) as overtime_amount,/* 加钟消费金额 */
  158. SUM(CASE WHEN state = 12 THEN COALESCE(tip_amount, 0) ELSE 0 END) as tip_amount,/* 打赏消费金额 */
  159. SUM(CASE WHEN type != 3 AND state = 12 THEN pay_amount + balance_amount ELSE 0 END) as order_amount/* 订单消费金额 */
  160. FROM `order`
  161. GROUP BY user_id
  162. ) o ON o.user_id = mu.id
  163. LEFT JOIN (
  164. SELECT user_id, COUNT(*) as violation_count
  165. FROM violation_records
  166. GROUP BY user_id
  167. ) vr ON vr.user_id = mu.id
  168. /* 一级邀请人关联 */
  169. LEFT JOIN market_dist_teams mdt1 ON mu.id = mdt1.user_id AND mdt1.level = 1
  170. LEFT JOIN coach_info_records ci1 ON mdt1.object_type = 'App\\Models\\CoachUser' AND mdt1.object_id = ci1.coach_id
  171. LEFT JOIN member_users mu1 ON mdt1.object_type = 'App\\Models\\MemberUser' AND mdt1.object_id = mu1.id
  172. /* 二级邀请人关联 */
  173. LEFT JOIN market_dist_teams mdt2 ON mu.id = mdt2.user_id AND mdt2.level = 2
  174. LEFT JOIN coach_info_records ci2 ON mdt2.object_type = 'App\\Models\\CoachUser' AND mdt2.object_id = ci2.coach_id
  175. LEFT JOIN member_users mu2 ON mdt2.object_type = 'App\\Models\\MemberUser' AND mdt2.object_id = mu2.id