以下查询在启用ONLY_FULL_GROUP_BY 时无效。第一个无效,因为选择列表中的名称未在GROUP BY 子句中命名
mysql> SELECT name, MAX(age) FROM t;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...)
如果没有 GROUP BY 子句,则没有 GROUP 列是非法的
您可以重写查询以正常工作
mysql> SELECT name, MAX(age) FROM t GROUP BY name;
或
关闭ONLY_FULL_GROUP_BY,错误就会消失。
链接可能对您有所帮助
- 可以搜索MySQL错误here
-
group-by-functions
- similar post on stackoverflow.com
- another forum where similar problem discussed
-
server-sql-mode
更新
这是对您评论的回答。
But i would like to know more about disabling the Group BY mode in mysql db.
Server SQL Modes
MySQL 服务器可以在不同的 SQL 模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于 sql_mode 系统变量的值。此功能使每个应用程序都可以根据自己的要求调整服务器的操作模式。
要在服务器启动时设置 SQL 模式,请在命令行中使用 --sql-mode="modes" 选项,或在选项文件中使用 sql-mode="modes",例如 my.cnf (Unix operating systems) 或 my.ini (Windows)。模式是用逗号分隔的不同模式的列表。要显式清除 SQL 模式,请在命令行上使用 --sql-mode="" 或在选项文件中使用 sql-mode="" 将其设置为空字符串。
-
要在运行时更改 SQL 模式,请使用
SET [GLOBAL|SESSION] sql_mode='modes'
语句来设置 sql_mode 系统变量。设置 GLOBAL 变量需要 SUPER 权限,并会影响从那时起连接的所有客户端的操作。设置 SESSION 变量仅影响当前客户端。任何客户端都可以随时更改自己的会话 sql_mode 值。
-
要确定当前的全局或会话 sql_mode 值,请使用以下语句:
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
可以参考sql_mode table
I followed the manuals, Added the ONLY_FULL_GROUP_BY in sql-mode
but no difference.
这是因为 MySQL 版本。您本地计算机的 MySQL 版本是多少?
如何查看 MySQL 版本?
mysql> SELECT version();
+-----------+
| version() |
+-----------+
| 5.5.28 |
+-----------+
1 row in set (0.00 sec)
为了测试 sql_mode ONLY_FULL_GROUP_BY,我创建了带有两列 id, name 的表 patient 并插入了记录。请记住 sql_mode ONLY_FULL_GROUP_BY 不是默认设置,如果需要,您需要设置。
1)MySQL版本5.0.45-community-nt
SELECT name, MAX(id) FROM patient;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
失败了,将 sql_mode 设置为 ONLY_FULL_GROUP_BY 没有意义,因为它不允许未在 GROUP BY 子句中命名的非聚合列。
2)MySQL版本5.1.40-community
mysql> SELECT name, MAX(id) from patient;
+----------+--------+
| MAX(id) | name |
+----------+--------+
| 33 | aniket |
+----------+--------+
1 row in set (0.03 sec)
然后设置sql_mode后ONLY_FULL_GROUP_BY
mysql> set sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT name, MAX(id) from patient;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
3)MySQL版本5.5.28
mysql> SELECT name, MAX(id) from patient;
+----------+--------+
| MAX(id) | name |
+----------+--------+
| 33 | aniket |
+----------+--------+
1 row in set (0.03 sec)
然后设置sql_mode后ONLY_FULL_GROUP_BY
mysql> set sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT name, MAX(id) from patient;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
结论
如您所见,查询在 5.0.45 版本上失败,在 5.1.40 和 5.5.28 上/之后成功
在 MySQL 版本之前,5.1.10(not sure) 没有 GROUP BY 的查询无论是否设置了 sql_mode ONLY_FULL_GROUP_BY 都会失败。
一些有趣的bug和sql_mode faq链接
- ONLY_FULL_GROUP_BY sql mode is overly restrictive
- sql-mode: only full group by mode not working
- MySQL 5.0 FAQ: Server SQL Mode