backfill_users_stone_balances.sql 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. -- 将历史数据回填到 users.conversation_energy_stone_total / crystal_stone_total
  2. -- 规则与 EnergyStoneService.get_stone_counts 对齐(对话侧):
  3. -- 对话余额 = COUNT(conversation_energy_stones) + bonus - FLOOR(SUM(asset_purchase_logs.cost_energy))
  4. -- 水晶余额 = COUNT(mission_energy_stones) - FLOOR(SUM(asset_purchase_logs.cost_crystal))
  5. -- 若库中无 asset_purchase_logs 表,请先注释掉 spent 相关子查询,或仅执行第一节 ALTER 后用手工脚本。
  6. --
  7. -- 说明:若购物消耗仅记在 purchase_orders(无流水表),需单独按订单汇总后再 UPDATE,本脚本未合并订单表逻辑。
  8. -- 1) 对话能量石余额
  9. UPDATE `users` u
  10. INNER JOIN (
  11. SELECT
  12. uu.user_id AS uid,
  13. GREATEST(
  14. 0,
  15. COALESCE(ce.cnt, 0)
  16. + COALESCE(b.bonus_conversation_count, 0)
  17. - COALESCE(sp.energy_spent, 0)
  18. ) AS bal
  19. FROM `users` uu
  20. LEFT JOIN (
  21. SELECT user_id, COUNT(*) AS cnt
  22. FROM `conversation_energy_stones`
  23. GROUP BY user_id
  24. ) ce ON ce.user_id = uu.user_id
  25. LEFT JOIN `user_bonus_energy_stones` b ON b.user_id = uu.user_id
  26. LEFT JOIN (
  27. SELECT user_id, FLOOR(COALESCE(SUM(cost_energy), 0)) AS energy_spent
  28. FROM `asset_purchase_logs`
  29. GROUP BY user_id
  30. ) sp ON sp.user_id = uu.id
  31. ) x ON x.uid = u.user_id
  32. SET u.conversation_energy_stone_total = x.bal;
  33. -- 2) 水晶石余额
  34. UPDATE `users` u
  35. INNER JOIN (
  36. SELECT
  37. uu.user_id AS uid,
  38. GREATEST(
  39. 0,
  40. COALESCE(ms.cnt, 0) - COALESCE(sp.crystal_spent, 0)
  41. ) AS bal
  42. FROM `users` uu
  43. LEFT JOIN (
  44. SELECT user_id, COUNT(*) AS cnt
  45. FROM `mission_energy_stones`
  46. GROUP BY user_id
  47. ) ms ON ms.user_id = uu.user_id
  48. LEFT JOIN (
  49. SELECT user_id, FLOOR(COALESCE(SUM(cost_crystal), 0)) AS crystal_spent
  50. FROM `asset_purchase_logs`
  51. GROUP BY user_id
  52. ) sp ON sp.user_id = uu.id
  53. ) x ON x.uid = u.user_id
  54. SET u.crystal_stone_total = x.bal;