MySQL:SQL错误:1140,SQLState:42000

我的项目中配置了两个数据库,一个在我的本地计算机上运行,​​另一个在远程服务器上运行。 访问远程数据库服务器时没有任何问题,但访问本地MySQL数据库时出现以下错误。

WARN [org.hibernate.util.JDBCExceptionReporter] SQL Error: 1140, SQLState: 42000 ERROR [org.hibernate.util.JDBCExceptionReporter] Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause 

我看到了MySQL文档,但无法完全理解其根本原因。 我认为,因为我可以从远程数据库中获取相同的数据,然后java code and query是正确的。

启用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 ,错误应该消失。

链接可以帮助您

  1. 您可以在此处搜索MySQL错误
  2. 组按function
  3. stackoverflow.com上的类似post
  4. 另一个讨论类似问题的论坛
  5. 服务器SQL模式

UPDATE

这是你的评论的答案。

 But i would like to know more about disabling the Group BY mode in mysql db. 

服务器SQL模式

  • MySQL服务器可以在不同的SQL模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于sql_mode系统变量的值。 此function使每个应用程序能够根据自己的要求定制服务器的操作模式。

  • 要在服务器启动时设置SQL模式,请在命令行上使用--sql-mode="modes"选项,或在my.cnf (Unix operating systems)等选项文件中使用sql-mode="modes"my.ini (Windows) 。 modes是由逗号分隔的不同模式的列表。 要显式清除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表


 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和inserted记录的table 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子句中未命名的非ONLY_FULL_GROUP_BY列。

2)MySQL版本5.1.40-社区

 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之前(不确定)没有GROUP BY查询失败,无论ONLY_FULL_GROUP_BY设置了sql_mode ONLY_FULL_GROUP_BY

一些有趣的bug和sql_mode faq链接

  1. ONLY_FULL_GROUP_BY sql模式过于严格
  2. sql-mode:只有模式不起作用的完整组
  3. MySQL 5.0 FAQ:服务器SQL模式

您需要包含GROUP BY子句(您没有发布您的查询,但我猜您根据错误遗漏了一个)。 这只是你的本地主机而不是远程服务器上的问题的原因是远程服务器可能已关闭ONLY_FULL_GROUP_BY ,但你的本地数据库已启用它。

理想情况下,您应该指定GROUP BY子句,但您也可以只切换本地数据库的ONLY_FULL_GROUP_BY设置。