当前位置: 首页 > news >正文

关于MySql的ONLY_FULL_GROUP_BY问题

近日,在开发博客的时候,遇到了一个问题,归档不显示,安装后页面看不见,找了很多原因,都无法解决,最后终于从列的一致性上找到了原因。问题解决了之后,博客归档页面完美呈现。

一、正确代码:

$archives = $db->fetchAll(" SELECT DATE_FORMAT(create_time, '%Y年%m月') as month, COUNT(*) as count FROM article WHERE status = 1 GROUP BY DATE_FORMAT(create_time, '%Y年%m月') ORDER BY MIN(create_time) DESC LIMIT 10 ");

二、错误代码:

$archives = $db->fetchAll(" SELECT DATE_FORMAT(create_time, '%Y年%m月') as month, COUNT(*) as count FROM article WHERE status = 1 GROUP BY YEAR(create_time), MONTH(create_time) ORDER BY YEAR(create_time) DESC, MONTH(create_time) DESC LIMIT 10 ");

三、代码分析

1、这段代码的作用

这段代码的作用是:从数据库的文章表中,按月份统计文章数量,生成归档列表。

比如:

2025年05月 → 3篇文章

2025年04月 → 1篇文章

2025年03月 → 5篇文章

2、正确代码解析

SELECT DATE_FORMAT(create_time, '%Y年%m月') as month, -- 将日期格式化为"2025年05月" COUNT(*) as count -- 统计该月份有多少篇文章 FROM article -- 从文章表查询 WHERE status = 1 -- 只统计已发布的文章 GROUP BY DATE_FORMAT(create_time, '%Y年%m月') -- 按格式化后的月份分组 ORDER BY MIN(create_time) DESC -- 按月份倒序排列(最新的在前) LIMIT 10 -- 只取最近10个月

3、原来的错误代码

SELECT DATE_FORMAT(create_time, '%Y年%m月') as month, COUNT(*) as count FROM article WHERE status = 1 GROUP BY YEAR(create_time), MONTH(create_time) -- ❌ 问题在这里 ORDER BY YEAR(create_time) DESC, MONTH(create_time) DESC

四、错误原因:ONLY_FULL_GROUP_BY

1、什么是ONLY_FULL_GROUP_BY

这是 MySQL 的一种严格模式,它要求:

GROUP BY中出现的列,必须和SELECT中的非聚合列完全一致。

2、错误分析

SELECT DATE_FORMAT(create_time, '%Y年%m月') as month, -- 非聚合列(格式化后的) COUNT(*) as count -- 聚合列(没问题) FROM article GROUP BY YEAR(create_time), MONTH(create_time) -- 按年、月分组

问题

  • SELECT中的非聚合列是DATE_FORMAT(create_time, '%Y年%m月')

  • GROUP BY中的列是YEAR(create_time), MONTH(create_time)

这两者不相等!MySQL 无法确定DATE_FORMAT(create_time, '%Y年%m月')是否和YEAR(...), MONTH(...)一一对应。

3、举例说明

假设有两条记录:

  • 记录1:create_time = '2025-05-01 10:00:00'

  • 记录2:create_time = '2025-05-15 14:30:00'

YEAR(create_time), MONTH(create_time)分组,它们属于同一组(都是2025年5月)。

DATE_FORMAT(create_time, '%Y年%m月')对两条记录都返回"2025年05月",这没问题。

但问题是:MySQL 的严格模式不信任这种转换,它要求SELECT中的非聚合列必须直接出现在GROUP BY中,不能通过函数转换。


五、修复方法的原理

GROUP BY DATE_FORMAT(create_time, '%Y年%m月')

为什么这样就能工作?

因为现在SELECT中的非聚合列和GROUP BY中的列完全一致了:

SELECT 中的非聚合列GROUP BY 中的列
DATE_FORMAT(create_time, '%Y年%m月')DATE_FORMAT(create_time, '%Y年%m月')

MySQL 可以明确知道:按这个表达式分组,每个组的值是唯一的。


六、关于ORDER BY MIN(create_time) DESC

ORDER BY MIN(create_time) DESC

因为我们是按月份分组,不是按具体时间。MIN(create_time)取每个组中最早的日期:

  • 2025年05月组 →MIN(create_time)=2025-05-01(组内最早的)

  • 2025年04月组 →MIN(create_time)=2025-04-03

MIN(create_time)倒序排列,结果就是:最新月份在前面


七、对比两种写法

写法优点缺点
GROUP BY YEAR(...), MONTH(...)性能稍好(使用索引)严格模式下报错
GROUP BY DATE_FORMAT(...)兼容严格模式可能无法使用索引

总结

问题原因解决
归档页面报错MySQL 严格模式要求GROUP BYSELECT中的非聚合列一致改用GROUP BY DATE_FORMAT(...)

一句话:严格模式下,GROUP BY后面跟什么,SELECT中非聚合列就必须是什么,不能有函数转换的差异。

http://www.jsqmd.com/news/858260/

相关文章:

  • MySQL数据库存储的路径反斜杠“\“消失了
  • 金华黄金手镯回收纯银回收白金回收50分钻石回收二手钻石回收高价多少钱一克同城价格查询上门上门估价闲置变现转让靠谱权威排行榜 - 检测回收中心
  • 高压线相位检测常见问题解答(2026专家版) - 速递信息
  • STM32F407用HAL库驱动42步进电机,从CubeMX配置到代码调试的完整避坑指南
  • GitHub Desktop中文界面本地化终极指南:3分钟解锁全中文Git工作流
  • 2026网络定相设备最新推荐:权威测评发布,网络定相仪选型指南 - 速递信息
  • 【H100】cuda H100 GPU硬件架构
  • Faze4开源六轴机械臂深度解析:从3D打印到工业级机器人的技术实践
  • 暗黑破坏神2存档修改器终极指南:告别重复刷装备,5分钟打造完美角色!
  • 时光回溯:当网页消失时,如何用Wayback Machine找回数字记忆?
  • 金华旧黄金回收旧银饰回收PT950铂金回收钻戒回收金银铂钻回收本地排名正规门店专业推荐哪家靠谱二手哪家强 - 检测回收中心
  • 告别Python程序分发难题:Auto PY to EXE图形化打包终极指南
  • 2026 年 Gemini CLI 向 Antigravity CLI 过渡,新平台更快、更高效!
  • ComfyUI InstantID完整指南:三步掌握AI人脸保留与风格转换
  • 安徽黄金项链回收老银器回收旧铂金回收1克拉钻石回收二手铂金回收高价多少钱一克同城价格查询上门上门估价闲置变现转让靠谱权威排行榜 - 检测回收中心
  • 如何快速完整备份微信聊天记录:免费开源工具WeChatExporter使用指南
  • 如何无限期使用Cursor AI编程助手:完整免费方案指南
  • 用 CCSwitch + Claude 插件使用 DeepSeek 的保姆级指南(附上完整过程截图和软件安装链接)
  • 2026年无锡防水翻新优质服务机构权威推荐及深度实力解析 - 十大品牌榜单
  • Midjourney新艺术风格爆发式迭代:3天内必须掌握的5个未公开--style_ref权重调优公式
  • 通过Taotoken模型广场为不同任务选择合适的大模型
  • Unity AI 编程(VS Code + Cline + DeepSeek-V4)【+1】
  • 晋城黄金回收白银回收铂金回收钻石回收贵金属回收高价多少钱一克同城价格查询上门上门估价闲置变现转让靠谱权威排行榜 - 检测回收中心
  • 衡阳黄金戒指回收白银首饰回收高价铂金回收品牌钻戒回收二手白银回收本地排名正规门店专业推荐哪家靠谱二手哪家强 - 检测回收中心
  • 安康黄金吊坠回收同城白银回收同城铂金回收钻石首饰回收本地贵金属回收本地排名正规门店专业推荐哪家靠谱二手哪家强 - 检测回收中心
  • R3nzSkin国服特供版:安全高效的英雄联盟换肤解决方案
  • 0.001 ml/min 意味着什么?深度解析差压式检漏仪的精度革命
  • 音视频AI检索技术现状、核心架构与未来应用发展研究报告
  • 一文理解“架构思维”
  • 如何在5分钟内用easy-topo绘制专业网络拓扑图