如何在MySQL查询中关联日志表并计算真实总积分?
修改后的SQL语句
SELECT users.ID, user_email, SUM(rewards.points) AS totalPoints, SUM(log.points) AS deductedPoints, SUM(rewards.points) + COALESCE(SUM(log.points), 0) AS real_total_points FROM wp_users AS users INNER JOIN wp_wc_points_rewards_user_points AS rewards ON users.id = rewards.user_id LEFT JOIN wp_wc_points_rewards_user_points_log AS log ON users.id = log.user_id AND log.points < 0 -- 只取日志表中扣减积分的记录 WHERE rewards.points <> 0 -- 明确筛选rewards表中非0的积分记录 GROUP BY users.ID, user_email -- 按用户主键和邮箱分组,避免分组报错 HAVING real_total_points > 0 -- 可选:如果只需要真实总积分大于0的用户 ORDER BY real_total_points DESC
核心修改点说明
- 关联日志表并筛选负值:用
LEFT JOIN关联日志表,同时在关联条件里加上log.points < 0,直接过滤出扣减积分的记录,这样没有扣减记录的用户也不会被排除。 - 计算真实总积分:原查询的总积分
totalPoints加上日志表中所有扣减积分的总和(因为日志里的points是负数,加负数等于减去绝对值)。用COALESCE处理没有扣减记录的情况,防止NULL导致计算结果出错。 - 消除字段歧义:把原查询里的
WHERE points <> 0改成rewards.points <> 0,避免多表关联时字段名冲突。 - 规范分组逻辑:分组字段加上
users.ID,符合SQL的严格分组规则,避免开启ONLY_FULL_GROUP_BY模式时出现错误。
内容的提问来源于stack exchange,提问作者Jess McKenzie
相关产品推荐
相关产品推荐

