20261009_add_rental_user_member_fields.sql 1.4 KB

1234567891011121314151617181920212223242526
  1. -- 会员开通/续费后台能力:sa_rental_user 加会员到期快照字段 + 回填历史记录。
  2. -- 此 SQL 的 ALTER 不能重复执行;建议使用 scripts/migrate_rental_user_member_fields.php。
  3. -- 1) ALTER 加字段(idempotent)。MySQL 8.0+ 支持 IF NOT EXISTS;
  4. -- 旧版 MySQL 用 INFORMATION_SCHEMA 判定是否已存在。
  5. ALTER TABLE `sa_rental_user`
  6. ADD COLUMN `member_expire_at` DATETIME NULL COMMENT '会员到期时间' AFTER `card_gift_balance`,
  7. ADD COLUMN `member_card_type` TINYINT NOT NULL DEFAULT 0 COMMENT '当前会员卡类型 0月卡 1季卡 2半年卡 3年卡' AFTER `member_expire_at`,
  8. ADD KEY `idx_rental_user_member_expire` (`member_expire_at`);
  9. -- 2) 回填:取每个用户最近一次开通/续费成功的卡类型与到期时间。
  10. -- 仅回填 status=1 且尚未过期的记录,避免把已过期失效的卡作为快照。
  11. UPDATE `sa_rental_user` u
  12. INNER JOIN (
  13. SELECT r.user_id,
  14. SUBSTRING_INDEX(GROUP_CONCAT(r.card_type ORDER BY r.expire_time DESC), ',', 1) + 0 AS latest_card_type,
  15. MAX(r.expire_time) AS latest_expire_time
  16. FROM `sa_member_activation_record` r
  17. WHERE r.`delete_time` IS NULL
  18. AND r.`status` = 1
  19. AND r.`expire_time` >= NOW()
  20. GROUP BY r.user_id
  21. ) latest ON latest.user_id = u.id
  22. AND u.`member_expire_at` IS NULL
  23. SET u.`member_card_type` = latest.latest_card_type,
  24. u.`member_expire_at` = latest.latest_expire_time;