给「新客」和「参加过直播」两个分组各发一版,同时带两个标签的 1200 个用户两封都没收到,后台显示分组人数 0。乍看像缓存或者权限的锅,追下去往往不是。

SELECT DISTINCT user_id FROM user_tags
WHERE tag_id IN (12, 18);

追下去是这么回事:分组规则把多个标签条件拼成了 AND,要求一条记录同时命中两个标签值,而标签是分行存的,单条记录不可能同时等于两个值。改成按用户 ID 去重更稳。

「分组条件逻辑」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

具体做法是,把标签条件改成 IN 查询,先取出命中任一标签的用户 ID 集合;多个条件之间用 UNION 去重,别在 WHERE 里堆 AND;发送前先看分组预览人数,和导出的 ID 数对一遍。

验收就看一点,分组预览人数从 0 变成 1200,两个标签的用户各收到一封而不是两封。

作者 9823189