Moodle SQL用户分类报表重复用户重复显示问题修复
问题根源
当前SQL通过内连接关联用户自定义字段的两张表时,会拉取每个用户关联的所有自定义字段记录,而不是仅拉取duplicated字段的记录:
- 匹配到duplicated字段的行时,符合第一个WHEN条件,被标记为「Duplicated user」
- 匹配到该用户其他自定义字段的行时,前三个WHEN条件都不满足,走到ELSE分支被标记为「Normal user」
你加的DISTINCT是对整行结果做去重,两行的Usertype值不同,无法去重,最终就会出现同一个重复用户显示两条记录的问题。
修复代码
把全量关联自定义字段的写法,改成左连接单独提取duplicated字段的状态,从根源避免多余行产生,同时保留要求的分类优先级(重复用户 > 测试用户 > 特殊用户 > 普通用户):
SELECT u.email, u.username, u.lastname, IF( DATE_FORMAT(FROM_UNIXTIME(u.firstaccess),'%Y-%m-%d') = '1970-01-01', 'Never logged in', DATE_FORMAT(FROM_UNIXTIME(u.firstaccess),'%Y-%m-%d') ) AS `First log in`, u.firstname, CASE WHEN duplicated_flag.data = 1 THEN 'Duplicated user' WHEN u.firstname LIKE '%test%' THEN 'Test user' WHEN u.email LIKE '%@xy.com%' THEN 'Special user' ELSE 'Normal user' END AS Usertype FROM prefix_user AS u -- 仅关联duplicated自定义字段,不会拉取其他自定义字段产生冗余行 LEFT JOIN prefix_user_info_data AS duplicated_flag ON duplicated_flag.userid = u.id LEFT JOIN prefix_user_info_field AS duplicated_field ON duplicated_flag.fieldid = duplicated_field.id AND duplicated_field.shortname = 'duplicated' WHERE u.deleted = 0 AND u.username <> 'guest';
改动点说明
- 移除了无效的
DISTINCT:修改后每个用户仅对应一条结果,不需要额外去重 - 关联自定义字段时直接筛选shortname为
duplicated的字段,其他自定义字段不会进入结果集,从根源避免冗余行 - 分类判断逻辑完全匹配需求:只要duplicated字段勾选为1,优先判定为重复用户,不会被其他分类规则覆盖
内容的提问来源于stack exchange,提问作者user14506347
相关产品推荐
相关产品推荐

