我用WAMP服务器在我的windows PC上使用MySQL 5.7.13

我的问题是在执行这个查询时

SELECT *
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND
      `status` = 'Active'
GROUP BY `proof_type`

我总是得到这样的错误

SELECT列表中的表达式#1不在GROUP BY子句中,包含未聚合的列returntr_prod.tbl_customer_pod_uploads。id',它不依赖于GROUP BY子句中的列;这与sql_mode=only_full_group_by不兼容

你能告诉我最好的解决办法吗?

我需要这样的结果

+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| id | user_id | load_id | bill_id | latitude | langitude | proof_type | document_type | file_name    | is_private | status | createdon           | updatedon           |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
|  1 |       1 | 78      | 1       | 21.1212  | 21.5454   |          1 |             1 | id_Card.docx |          0 | Active | 2017-01-27 11:30:11 | 2017-01-27 11:30:14 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+

当MySQL的only_full_group_by模式被打开时,这意味着严格的ANSI SQL规则将在使用GROUP BY时应用。对于你的查询,这意味着如果你对proof_type列进行GROUP BY,那么你只能选择两件事:

proof_type列,或者 任何其他列的聚合

通过其他列的“聚合”,我指的是对另一列使用诸如MIN()、MAX()或AVG()之类的聚合函数。所以在你的情况下,下面的查询是有效的:

SELECT proof_type,
       MAX(id) AS max_id,
       MAX(some_col),
       MIN(some_other_col)
FROM tbl_customer_pod_uploads
WHERE load_id = '78' AND
      status = 'Active'
GROUP BY proof_type

我在SO上看到的绝大多数MySQL GROUP BY问题都关闭了严格模式,所以查询正在运行,但结果不正确。在您的情况下,查询根本不会运行,迫使您考虑真正想要做什么。

注意:ANSI SQL扩展了GROUP BY中允许选择的内容,也包括了功能上依赖于所选列的列。函数依赖的一个例子是按表中的主键列分组。由于保证主键对于每条记录都是唯一的,因此任何其他列的值也将确定。MySQL是允许这样做的数据库之一(SQL Server和Oracle不AFAIK)。


This

SELECT列表中的表达式#1不在GROUP BY子句中,包含未聚合的列returntr_prod.tbl_customer_pod_uploads。id',它不依赖于GROUP BY子句中的列;这与sql_mode=only_full_group_by不兼容

将通过这个命令改变MySQL中的sql模式来简单地解决,

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

这也适用于我。 我使用这个,因为在我的项目中有很多这样的查询,所以我只是将这个sql模式更改为only_full_group_by

或者简单地包括SELECT语句指定的GROUP BY子句中的所有列。sql_mode可以保持启用状态。

谢谢你!: -)


你可以禁用 sql_mode = only_full_group_by 通过一些命令,你可以尝试通过终端或MySql IDE

mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

打开WAMP面板,打开MySQL配置文件。在其中,如果找到“sql_mode”,则搜索它,将其设置为“”,否则,如果没有找到它,则在文件中添加sql_mode=“”。

重新启动MySQL服务器,你就可以开始了…

快乐的编码。


For the query to be legal in SQL92, the name column must be omitted from the select list or named in the GROUP BY clause. SQL99 and later permits such nonaggregates per optional feature T301 if they are functionally dependent on GROUP BY columns: If such a relationship exists between name and custid, the query is legal. This would be the case, for example, were custid a primary key of customers. MySQL 5.7.5 and up implements detection of functional dependence. If the ONLY_FULL_GROUP_BY SQL mode is enabled (which it is by default), MySQL rejects queries for which the select list, HAVING condition, or ORDER BY list refer to nonaggregated columns that are neither named in the GROUP BY clause nor are functionally dependent on them. via MySQL :: MySQL 5.7 Reference Manual :: 12.19.3 MySQL Handling of GROUP BY

你可以用下面的命令改变sql模式来解决这个问题:

SET GLOBAL sql_mode=(SELECT (@@sql_mode,'ONLY_FULL_GROUP_BY', "));

和…记得重新连接数据库!!


从它的外观来看,我认为分组多列/字段不会损害你的结果。你为什么不试试这样加入这个群呢:

GROUP BY `proof_type`, `id`

这将首先按proof_type进行分组,然后再按id进行分组。我希望这不会改变结果。在某些/大多数情况下,按多列分组会给出错误的结果。


在MySql引擎中有一个系统变量ONLY_FULL_GROUP_BY。

从Mysql版本5.7.5:只有_full_group_by SQL模式默认启用

5.7.5版本之前:默认不启用ONLY_FULL_GROUP_BY。

如果启用了ONLY_FULL_GROUP_BY SQL模式(这是5.7.5版本的默认设置),MySQL将拒绝select列表、HAVING条件或ORDER by列表引用非聚合列的查询,这些列既不在GROUP by子句中命名,也在功能上依赖于它们。

为了解决问题,可以使用以下3种解决方案中的任意一种

(1) PHPMyAdmin

不启用:只有full_group_by模式

如果您正在使用phpMyAdmin,则更改sql_mode设置,如下面的截图所示。

编辑sql模式变量并从值中删除ONLY_FULL_GROUP_BY文本

OR

(2) SQL/命令提示

禁用:只使用“full_group_by”模式。

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

OR

不要使用SELECT *

不要禁用ONLY_FULL_GROUP_BY模式,但是

在SELECT查询中使用相关列。相关的是指列,它们要么是按子句分组,要么是带有聚合函数的列(MAX, MIN, SUM, COUNT等)


重要提示

使用点(1)或点(2)所做的更改不会将其设置为永久,并且在每次重新启动后将恢复。

所以你应该在你的配置文件中设置这个(例如/etc/mysql/my.cnf在[mysqld]部分),这样更改在MySQL重启后仍然有效:

配置文件:/etc/mysql/my.cnf

变量名:sql_mode或sql-mode

从值中删除单词ONLY_FULL_GROUP_BY并保存文件。

注意:如果在配置文件中没有找到sql_mode变量,请在文件末尾插入以下2行

[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

在my.ini中,这样写:

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

取决于你的版本。或者:

[mysqld]
sql_mode = ""

或者简单地删除这个:ONLY_FULL_GROUP_BY


登录到phpMyAdmin 导航到:Server: localhost:3306并执行 不选择任何数据库 点击顶部菜单中的变量 搜索“sql mode”并将相应的值编辑为:NO_ENGINE_SUBSTITUTION

这是所有。

我在我的Ec2中这样做了,它很有魅力。


下面的方法解决了我的问题:

在ubuntu中

类型:sudo vi /etc/mysql/my.cnf

输入A进入插入模式

在最后一行粘贴下面两行代码:

[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

按esc退出输入模式

Type :wq to save and close vim.

输入sudo service mysql restart重启mysql。


MySQL 8.0升级

你的sql-mode不会有NO_AUTO_CREATE_USER,因为它已经被删除了,正如这里提到的-如何设置sql-mode-in-my-cnf-in-mysql-8

[mysqld]
sql-mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

此外,如果有人没有my.cnf文件,那么他们可以在/etc/mysql/my.cnf中创建一个新的文件,然后添加上面的行。


在Ubuntu中

步骤1:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

第二步:转到最后一行并添加以下内容

sql_mode = ""

第三步:保存

步骤4:重启mysql服务器。


Hi不是获取所有列,而是使用ANY_VALUE(column_name)获取所需的列。它工作得很完美。只是检查。

例如:

SELECT proof_type,any_value("customer_name") as customer_name
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND `status` = 'Active' GROUP BY `proof_type`

如果你正在使用PhpMyAdmin,搜索“SQL模式”,然后去掉值:ONLY_FULL_GROUP_BY, just did and it ok。


转到phpmyadmin并打开控制台并执行此请求

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

> sudo nano /etc/mysql/my.cnf

输入下面的

[mysqld]
sql_mode = ""

Ctrl + O => Y = Ctrl + X

> sudo service mysql restart

这里有一个非常快速和简单的方法来永久设置它

注意:running SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY', "));是临时的,在服务器重新启动时,仍然会出现错误。 要永久修复这个问题,请执行以下操作

以根用户身份登录到服务器 在终端运行中 wget https://gist.githubusercontent.com/nfourtythree/90fb8ef5eeafdf478f522720314c60bd/raw/disable-strict-mode.sh 执行chmod +x disable-strict-mode.sh使脚本可执行 执行。/disable-strict-mode.sh

完成后,mysql将被修改,并将重新启动


我有类似的问题,我的部分数据库崩溃。我所做的是通过PHPStorm数据库控制台更改DB中的参数,如下所示:

   SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

现在工作很有魅力


only_full_group_by = on告诉MySQL引擎:当你怀疑要显示什么结果并抛出错误时,不要应用GROUP BY。只有当Group By明确告诉您要做什么时才应用它。即当Group By已满且完全时!

only_full_group_by = off告诉MySQL引擎:总是应用GROUP BY,如果你对选择什么结果有疑问,就随机选择一个!

如果你正确使用GROUP BY,你不必关闭它!

例子:

表:用户

 id   |  name
----------------
  1      ali
  2      john
  3      ali

在name列上使用GROUP BY时:

SELECT * FROM users GROUP BY name;

有两种可能的结果:

  1      ali
  2      john     

OR

  2      john
  3      ali

MYSQL不知道选择什么结果!因为有不同的id,但都有name=ali。

Solution1:

只选择名称字段:

SELECT name FROM users GROUP BY name;

结果:

  ali
  john     

这是一个完美的解决方案。删除使GROUP BY混淆的列。这意味着你知道你在做什么。通常,你不需要 这些列,但如果您需要它们,请转到解决方案3!

Solution2:

关闭only_full_group_by。MYSQL将从两个可能的结果中随机选择一个!!(如果您不关心它将选择什么id,这是可以的,但请记住在查询后立即打开它,以防止将来的groupby中出现意外行为)

环境

使用像MIN(), MAX()这样的聚合函数来帮助MYSQL决定它必须选择什么。

例如:

SELECT MAX(id), name FROM users GROUP BY name;

它将选择具有最大id的ali行:

  2      john     
  3      ali

我正面临着这个问题,下面的问题还不够

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

因为我用的是存储过程。执行此查询后,我必须删除过程并重新创建。


在运行查询之前运行下面的查询

SET SQL_MODE = '';

适用于CentOS/RHEL (Linux服务器)和XAMPP本地操作系统

你好,我有一个非常不同的解决方案,我希望这能帮助到一些人。(可能看起来有点过分,但这对我来说真的很有用,不像其他解决方案)

我正在运行CentOS 7,我所有的代码都在本地工作,但当我上传到我的服务器时,我开始得到这个问题解决的错误。

几个小时后,我尝试从不同的角度来看这个问题,我记得我的本地设置使用XAMPP,我以为我使用的是MySQL 8 (MySQL 8安装在我的服务器上)。

但是从XAMPP登录到MySql后,我得到了下面的输出:

mysql -u root -p //Login


Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 27
Server version: 10.4.18-MariaDB mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

是的,你可能已经注意到同样的,XAMPP使用MariaDB,所以解决方案是卸载mysql并安装MariaDB

当我运行Centos 7时,这样做的步骤如下:

从你的服务器删除mysql


# yum remove mysql mysql-server

更新你的系统(这是常见的每次我们安装新东西)


# sudo yum  -y update

将MariaDB添加到存储库


# sudo tee /etc/yum.repos.d/MariaDB.repo<<EOF 
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF

更新缓存


# sudo yum makecache fast

安装 MariaDB


# sudo yum -y install MariaDB-server MariaDB-client

添加MariaDB到启动(每次系统重新启动时启动MariaDB)


#sudo systemctl enable --now mariadb

然后你可以通过运行下面的命令来保护你的安装:

# sudo mysql_secure_installation

最后一个命令将开始一个过程,您可以在其中设置密码和其他选项。

之后不要忘记添加非root用户,并授予它必要的特权,这是因为你不能在你的应用程序中使用root用户(是的,我必须弄清楚这一点)

首次使用root帐号登录:

# mysql -u root -p

然后添加您的用户并授予权限:

CREATE USER 'YourUserName'@localhost IDENTIFIED BY 'YourPassword';
GRANT ALL PRIVILEGES ON *.* TO 'YourUserName'@localhost IDENTIFIED BY 'YourPassword' WITH GRANT OPTION;

最后,你必须创建你的数据库,导入你的表/数据/触发器/过程。

现在您将能够毫无问题地运行代码,就像您的本地设置一样。(也许你将不得不安装mysql扩展,以防你不得不在本地做)。


还可以简单地将GROUP_CONCAT()添加到非聚合列中。

像GROUP_CONCAT (your_column)


登录到phpMyAdmin 导航到:服务器:http://localhost/phpmyadmin,不要选择任何数据库 点击SQL从顶部菜单和虫害下面的代码运行SQL查询/查询服务器 SET GLOBAL sql_mode=(SELECT (@@sql_mode,'ONLY_FULL_GROUP_BY', ")); 比照链接


两种解决方案:

)使用

SET GLOBAL sql_mode=(SELECT (@@sql_mode,'ONLY_FULL_GROUP_BY', "));

b)可以在不禁用ONLY_FULL_GROUP_BY的情况下使用ANY_VALUE()引用非聚合列来达到同样的效果。

ANY_VALUE(值)


如果你在Mac上使用MAMP,当你重新启动MAMP时,对MySQL变量的任何更改都将被擦除。要确保更改是永久性的,请执行以下操作:

停止正在运行的MAMP服务器。

使用文本编辑器创建一个名为my.cnf的文件,并将其保存到/Applications/MAMP/conf文件夹中。将文件放在文件夹的根目录下(这看起来有点奇怪,因为它包含了大量的apache文件夹,但这是可以的)。在文件中添加如下代码行:

[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

保存文件并关闭编辑器。 启动MAMP服务器。

这将使改变成为永久性的。


在我的例子中,这是我的旧sql_mode

sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

您可以使用

show variables like "sql_mode";

然后我把它设置成这样

SET sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

步骤1。检查sql模式:

SELECT @@GLOBAL.sql_mode;

步骤2。在/etc/mysql/conf目录下创建一个新的配置文件。d /目录:

sudo nano /etc/mysql/conf.d/disable_strict_mode.cnf

在编辑器中输入以下文本:

[mysqld]

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

步骤3。重新启动MySQL:

sudo service mysql restart

步骤4。确认更改:

SELECT @@GLOBAL.sql_mode;

如果你不想禁用ONLY_FULL_GROUP_BY模式,你只需要在GROUP BY子句中指定你想选择的每一列。

不要使用通配符(*),并确保您的列与您的需求相关


有时候你只需要检查你的查询是否有正确的Order和Order的方式。

GROUP BY pp.id_product
FIELD(pp.id_product, 1600, 1870, 2300 );

除非将排序方式(DESC或ASC)添加到查询中,否则该命令不会运行

GROUP BY pp.id_product
FIELD(pp.id_product, 1600, 1870, 2300 ) DESC;

这将在不破坏服务器的会话和全局设置的情况下完成任务。


设置全局sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; 如果问题仍然存在,并且您正在使用Laravel,在config/database.php中将'strict'设置为false 'mysql' => [ ... 'strict' => false, ... ],