You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:39:32