MySQL 5.5.X版本GROUP BY错误解决方法

在MySQL 5.7.X版本中,GROUP BY查询遇到ONLY_FULL_GROUP_BY错误。通过查看sql_mode,发现该值导致问题。解决办法是在Linux系统的mysql.conf.d/mysqld.cnf配置文件中,于[mysqld]段添加一行禁用ONLY_FULL_GROUP_BY,然后重启MySQL服务使更改生效。注意,直接在命令行设置sql_mode只会临时改变,不会持久。

安装新本版的MySQL GROUP BY分组查询会出现错误提示如下:

[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

MySQL 5.7.X的默认的sql_model值为(进入MySQL输入命令select @@global.sql_mode即可查看):

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

问题就出现在ONLY_FULL_GROUP_BY上,需要把该值去掉即可.
以Linux的MySQL 5.7.20为例说明修改方法:
打开mysql配置文件sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf,然后在[mysqld]下添加如下一行:

sql_mode=STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER

默认配置中没有sql_mode,自行添加此行,添加了此行配置就把ONLY_FULL_GROUP_BY默认的去掉了,保存之后重启MySQL即可(sudo service mysql restart).

提示:如果进入MySQL命令行方式设置sql_model值,重启Mysql就又恢复默认值了,属于当前session范围的.所以最好直接修改配置文件,这样就会永久有效.

<think>嗯,用户询问MySQL 5.5是否支持GROUP_ORDER功能。先仔细分析这个问题:用户可能混淆了SQL语法中的两个不同子句——GROUP BY和ORDER BY。 查阅MySQL官方文档确认,MySQL 5.5确实不支持所谓的GROUP_ORDER语法。标准SQL中分组和排序是两个独立操作:GROUP BY用于聚合分组数据,ORDER BY用于对结果排序。用户可能在文档中看到过类似"GROUP BY ... ORDER BY ..."的写法,但这其实是两个子句的组合使用。 注意到用户提供的引用材料很有价值:引用[3]提到MySQL 5.7和5.5GROUP BY行为上的差异,说明用户可能遇到过版本兼容性问题。虽然引用中没有直接讨论ORDER BY,但暗示了版本差异的重要性。 需要向用户解释清楚:在MySQL 5.5中实现分组后排序的标准写法是在GROUP BY后使用ORDER BY子句。例如"SELECT department, AVG(salary) FROM employees GROUP BY department ORDER BY AVG(salary) DESC"这样的结构。 考虑到用户可能是数据库管理员或开发者,准备补充说明两个要点:一是GROUP BY本身不保证结果顺序,二是排序可能影响含有LIMIT子句的查询结果。这些在实际开发中都是常见痛点。 最后规划相关问题:围绕版本特性差异、分组后排序的实现方式、以及常见错误场景来设计,这样能覆盖用户可能遇到的延伸问题。特别要注意提醒5.5版本GROUP BY的隐式排序特性在后续版本被废弃的情况,这对升级迁移很重要。</think>在 MySQL 5.5 中,**没有名为 `GROUP_ORDER` 的功能或语法**。标准 SQL 和 MySQL 使用两个独立的子句来实现分组和排序: 1. **`GROUP BY`**: 用于将行分组到汇总行中,通常与聚合函数(如 `COUNT()`, `SUM()`, `AVG()`, `MAX()`, `MIN()`)一起使用。 2. **`ORDER BY`**: 用于对查询的**最终结果集**进行排序。 **在 MySQL 5.5 中实现“分组后排序”的标准方法:** 你需要将 `GROUP BY` 和 `ORDER BY` 子句结合使用。`ORDER BY` 子句放在 `GROUP BY` 子句之后,用于对分组聚合后的结果进行排序。 **语法示例:** ```sql SELECT column1, aggregate_function(column2) FROM table_name WHERE condition GROUP BY column1 ORDER BY aggregate_function(column2) [ASC | DESC]; -- 这就是你需要的“分组后排序” ``` **解释:** 1. `GROUP BY column1`:将结果集按 `column1` 的值分组。 2. `ORDER BY aggregate_function(column2)`:对分组后计算出的聚合结果(例如每个组的 `SUM(column2)` 或 `AVG(column2)`)进行升序 (`ASC`) 或降序 (`DESC`) 排序。 **重要提示 (MySQL 5.5 GROUP BY 行为):** * MySQL 5.5 在 `GROUP BY` 子句的实现上有一个**历史行为**:如果查询包含 `GROUP BY`,并且没有显式的 `ORDER BY` 子句,结果集可能会**隐式地**按照 `GROUP BY` 的列进行排序。但这**不是 SQL 标准的要求**,并且**结果顺序不可靠**,不能作为依赖。 * 从 **MySQL 5.7** 开始,默认的 SQL 模式 (`ONLY_FULL_GROUP_BY`) 变得更加严格,并且 **MySQL 8.0 移除了 `GROUP BY` 的隐式排序行为**。这意味着在更高版本中,如果没有 `ORDER BY`,`GROUP BY` 的结果顺序是**不确定**的。 * **最佳实践:** 无论使用哪个 MySQL 版本(包括 5.5),**如果需要对分组后的结果进行排序,务必显式使用 `ORDER BY` 子句**。不要依赖 `GROUP BY` 可能产生的隐式排序。 **结论:** MySQL 5.5 不支持 `GROUP_ORDER` 语法。要实现按分组聚合结果排序的需求,你必须在 `GROUP BY` 子句之后**显式地使用 `ORDER BY` 子句**来指定排序依据和顺序。同时,请注意 MySQL 5.5 中 `GROUP BY` 可能存在的隐式排序行为及其在后续版本中的变化[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值