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

MySQL自定义SQL统计用户数未返回全量数据,缺失2021-07-12对应行

问题原因
  • 核心错误是GROUP BY子句和统计维度不匹配:你的需求是按country_id+日期两个维度统计,但是你写的SQL仅按country_id单维度分组,这会把同一个国家下所有日期的记录合并为1行,日期字段只会随机取该分组内某一条记录的日期值,因此2021-07-12的country_id=4的记录被合并到了2021-07-13的country_id=4分组中,不会单独展示。
  • 你用的MySQL 5.7默认可能关闭了ONLY_FULL_GROUP_BY SQL模式,才允许这种SELECT字段和GROUP BY字段不匹配的语法运行,要是开启该模式你的SQL会直接报错,反而更容易定位问题。
  • 另外你写的WHERE country_id != ""存在逻辑问题:country_id是int类型,和空字符串对比时MySQL会把空字符串转为0,等价于country_id != 0,写法不规范容易出问题。
修正后的SQL

如果你要统计的是每个国家每天的去重用户数,用下面的SQL:

SELECT 
  COUNT(DISTINCT user_id) AS user_count,
  DATE(`date`) AS stat_date,
  country_id
FROM users_search_activity
GROUP BY country_id, stat_date
ORDER BY stat_date DESC, country_id ASC;

如果要统计的是每个国家每天的搜索次数(同一用户多次搜索算多次),把COUNT(DISTINCT user_id)换成COUNT(user_id)即可。

运行修正后的SQL,你就能看到缺失的2021-07-12、country_id=4的记录行。

额外建议
  • 生产环境建议开启MySQL的ONLY_FULL_GROUP_BY SQL模式,强制要求GROUP BY子句包含所有SELECT里的非聚合字段,避免出现不确定的统计结果。
  • 表中的date是SQL关键字,建议给字段加上反引号包裹,或者改名避免语法冲突。
  • 既然country_id定义为非空int字段,如果业务上没有排除0值的需求,可以删掉不必要的WHERE过滤条件。

内容的提问来源于stack exchange,提问作者NewUser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:15:05