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

MySQL按天统计IP数并获取单日最高IP计数的实现方法

问题原因

你原有SQL的外层查询错误添加了GROUP BY dates分组逻辑,最终返回的是每个日期自身的IP计数,完全无法计算全局维度的单日最高IP值——相当于把内层已经按天聚合好的结果,又按日期分组求最大值,输出结果和内层直接查询的按天计数结果没有区别,自然拿不到预期值。

正确实现方案

根据你需要的返回结果选择对应写法即可,原有日期截取逻辑如果经过验证能正确提取天维度日期,可以直接保留。

仅需要全局单日最高IP计数值(不需要对应日期)

内层子查询完成按天聚合后,外层直接去掉分组取最大值即可:

SELECT MAX(countIP) as single_day_max_ip
FROM (
    SELECT 
        LEFT(date, LOCATE(',', date, LOCATE(',', date) +1) -1) as stat_date, 
        COUNT(ip) as countIP
    FROM `apilogs`
    GROUP BY stat_date
) as day_level_stat;

需要拿到最高值对应的具体日期

  • 仅取单条最高记录(存在多天并列最高时只返回一条):
SELECT 
    LEFT(date, LOCATE(',', date, LOCATE(',', date) +1) -1) as stat_date, 
    COUNT(ip) as countIP
FROM `apilogs`
GROUP BY stat_date
ORDER BY countIP DESC
LIMIT 1;
  • 返回所有并列达到最高值的日期:
WITH day_level_stat AS (
    SELECT 
        LEFT(date, LOCATE(',', date, LOCATE(',', date) +1) -1) as stat_date, 
        COUNT(ip) as countIP
    FROM `apilogs`
    GROUP BY stat_date
)
SELECT stat_date, countIP
FROM day_level_stat
WHERE countIP = (SELECT MAX(countIP) FROM day_level_stat);
优化建议
  • 你当前使用的字符串截取逻辑强依赖Date字段的固定格式(第二个逗号前为天级日期),如果后续字段格式调整很容易出现截取错误。如果使用的数据库支持日期解析函数(比如MySQL的STR_TO_DATE),建议优先将字符串转换为标准日期类型后,用DATE()函数提取天维度,稳定性更高。
  • 如果存在同一个IP单日多次访问需要去重、IP字段可能为空的场景,将COUNT(ip)替换为COUNT(DISTINCT ip),避免统计结果不符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:57:35