我的查询:
select libelle,credit_initial,disponible_v,sum(montant) as montant
FROM fiche,annee,type where type.id_type=annee.id_type and annee.id_annee=fiche.id_annee
and annee = year(current_timestamp) GROUP BY libelle order by libelle asc
答案 0 :(得分:80)
我努力工作,我已经测试了它并且它正在使用灯服务器mysql版本5.12
所以,成功的步骤:
sudo vim /etc/mysql/conf.d/mysql.cnf
滚动到文件底部复制并粘贴
[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
到文件的底部
sudo service mysql restart
重启MySQL。完成!
答案 1 :(得分:34)
这对我有用:
mysql -u root -p
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
第一步可能需要sudo:
sudo mysql -u root -p
答案 2 :(得分:18)
您需要在GROUP BY
子句中指定您未用于聚合函数的所有列,如下所示:
select libelle,credit_initial,disponible_v,sum(montant) as montant
FROM fiche,annee,type where type.id_type=annee.id_type and annee.id_annee=fiche.id_annee
and annee = year(current_timestamp) GROUP BY libelle,credit_initial,disponible_v order by libelle asc
full_group_by
模式基本上可以让你编写更多惯用的SQL。如果您愿意,可以关闭此设置。 MySQL Documentation中概述了不同的方法。这是MySQL对上述内容的定义:
MySQL 5.7.5及更高版本实现了对功能依赖的检测。如果 启用ONLY_FULL_GROUP_BY SQL模式(默认情况下是这样), MySQL拒绝选择列表,HAVING条件或的查询 ORDER BY列表引用既未命名的非聚合列 GROUP BY子句在功能上也不依赖于它们。 (之前 5.7.5,MySQL不检测功能依赖性,默认情况下不启用ONLY_FULL_GROUP_BY。有关的描述 5.7.5之前的行为,参见MySQL 5.6参考手册。)
您收到错误是因为您使用的是版本< 5.7.5
答案 3 :(得分:13)
你可以禁用 的的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';
我试过这个并为我工作过。 谢谢:))
答案 4 :(得分:7)
解决方案1:从mysql控制台中删除ONLY_FULL_GROUP_BY
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
您可以在此处了解更多信息
解决方案2:从phpmyadmin中删除ONLY_FULL_GROUP_BY
Open phpmyadmin & select localhost
Click on menu Variables & scroll down for sql mode
Click on edit button to change the values & remove ONLY_FULL_GROUP_BY & click on save.
答案 5 :(得分:6)
您必须按NOT IN
group by
条款汇总{。}}。
因此,有两个选项...... 将Credit_Initial 和 Disponible_v 添加到{{1} }
OR
如果您知道值无论如何都是常量且没有其他影响,请将它们更改为group by
。
答案 6 :(得分:4)
基于5.7.5 ONLY_FULL_GROUP_BY的ond defualt配置 您应该通过
使用组中的所有非聚合列select libelle,credit_initial,disponible_v,sum(montant) as montant
FROM fiche,annee,type
where type.id_type=annee.id_type
and annee.id_annee=fiche.id_annee
and annee = year(current_timestamp)
GROUP BY libelle,credit_initial,disponible_v order by libelle asc
答案 7 :(得分:1)
因此,让我们充分理解,假设您有一个在localhost上有效但在生产模式下不可用的查询,这是因为在MySQL 5.7 and above
中,他们决定默认情况下激活sql_mode=only_full_group_by
,基本上是严格模式,防止您选择非聚合字段。
以下是查询(在本地模式下有效,但不在生产模式下可用):
SELECT post.*, YEAR(created_at) as year
FROM post
GROUP BY year
SELECT post.id, YEAR(created_at) as year // This will generate an error since there are many ids
FROM post
GROUP BY year
要验证是否激活了sql_mode=only_full_group_by
,应执行以下查询:
SELECT @@sql_mode; //localhost
输出:IGNORE_SPACE, STRICT_TRANS, ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
(如果您没有看到它,则表示它已被停用)
但是,如果在生产模式下尝试尝试,或在出现错误的地方尝试将其激活:
SELECT @@sql_mode; //production
输出: ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO...
我们正在这里寻找ONLY_FULL_GROUP_BY
。
否则,如果您使用的是 phpMyAdmin ,请转到-> Variables
并搜索sql_mode
让我们以前面的示例为例:
SELECT MIN(post.id), YEAR(created_at) as year //Here we are solving the problem with MIN()
FROM post
GROUP BY year
与MAX()
如果我们需要所有ID,我们将需要:
SELECT GROUP_CONCAT(post.id SEPARATOR ','), YEAR(created_at) as year
FROM post
GROUP BY year
或另一个新添加的功能:
SELECT ANY_VALUE(post.id), YEAR(created_at) as year
FROM post
GROUP BY year
⚠️ANY_VALUE对于MariaDB不存在
如果想要所有字段,则可以使用相同的字段:
SELECT ANY_VALUE(post.id), ANY_VALUE(post.slug), ANY_VALUE(post.content) YEAR(created_at) as year
FROM post
GROUP BY year
❌要停用sql_mode=only_full_group_by
,则需要执行以下查询:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
很抱歉这本小说,希望对您有所帮助。
答案 8 :(得分:0)
8.0+版本也发生了同样的事情。在8.0+版本中,默认情况下默认为“启用”。这是链接official document reference
对于5.6 +,5.7 +版本,默认情况下禁用属性“ ONLY_FULL_GROUP_BY”。
要禁用它,请遵循@Miloud BAKTETE建议的相同步骤
答案 9 :(得分:0)
此外,如果您使用 MySql 8+,请在控制台中尝试此命令:
打开 MySql 控制台
mysql -u user_name -p
并设置全局SQL模式
SET GLOBAL sql_mode='STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_ENGINE_SUBSTITUTION';
答案 10 :(得分:-1)
只需到窗口底部托盘单击wamp图标,单击mysql-> my.ini,然后有选项; sql-mode ="" 取消注释这使它像sql-mode ="" 并重新启动wamp 为我工作