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