我用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
步骤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;
下面的方法解决了我的问题:
在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中创建一个新的文件,然后添加上面的行。
有时候你只需要检查你的查询是否有正确的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;
这将在不破坏服务器的会话和全局设置的情况下完成任务。