我用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 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+

当前回答

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

其他回答

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

在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中这样做了,它很有魅力。

适用于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扩展,以防你不得不在本地做)。

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

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

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