如何查询仅持有无效推送令牌的用户?求最优SQL查询语句
最优查询方案:筛选所有令牌均无效的用户
首先假设你的推送令牌数据表结构符合常规设计(表名暂定为user_push_tokens),核心字段包括:
user_id: 用户唯一标识token: 推送令牌字符串is_valid: 令牌有效性标记(0=无效,1=有效,或布尔值false/true)
核心查询语句(适用于多数关系型数据库)
写法1:统计有效令牌数量(逻辑更直观)
SELECT user_id FROM user_push_tokens GROUP BY user_id HAVING COUNT(CASE WHEN is_valid = 1 THEN 1 END) = 0;
写法2:利用最大值判断(更简洁,适用于0/1标记场景)
SELECT user_id FROM user_push_tokens GROUP BY user_id HAVING MAX(is_valid) = 0;
为什么这是最优方案?
- 逻辑精准:严格筛选出所有令牌都无效的用户,会自动排除那些同时持有有效和无效令牌的用户(比如有部分有效令牌的用户1/2会被过滤掉)
- 性能高效:避免了嵌套子查询或关联查询,直接通过
GROUP BY+HAVING的聚合逻辑完成筛选,配合(user_id, is_valid)的联合索引可以实现快速分组统计 - 兼容性强:几乎支持所有主流关系型数据库(MySQL、PostgreSQL、SQL Server等),仅需根据
is_valid的实际类型微调(比如布尔值场景改成MAX(is_valid) = false)
额外优化建议
如果你的数据量较大,建议创建联合索引来加速查询:
CREATE INDEX idx_user_valid ON user_push_tokens(user_id, is_valid);
这个索引会大幅减少数据库的全表扫描开销,让分组和聚合计算更快。
内容的提问来源于stack exchange,提问作者raphaelrk
相关产品推荐
相关产品推荐

