错误1055(42000):SELECT列表的表达式#1不在GROUP BY子句中,并且包含未聚合的列

时间:2018-09-09 05:02:47

标签: mysql

在一个特定的查询错误结束后,我最近将Mysql从5.1迁移到5.7。 这是查询:

    select count(*) COUNT_PRODUCTS from 
 (select d.ID, d.EAN, d.NAME, d.SAP_CATEGORY_ID, d.SAP_VENDOR_ID, d.RELEASE_DATE,
 d.REMOVED_DATE, d.IS_DRAFT, d.DATA_STATE, d.gc, ATTRIBUTE_CODE AS ATTRIB_NAME, ATTRIBUTE_VALUE AS APP_STATUS from 
 (select b.ID, b.EAN, b.NAME,  b.SAP_CATEGORY_ID, b.SAP_VENDOR_ID, b.RELEASE_DATE, 
 b.REMOVED_DATE, b.IS_DRAFT, b.DATA_STATE,  group_concat(pl.LIFECYCLE_VALUE) gc from 
 (select a.ID, a.EAN, a.NAME,  a.SAP_CATEGORY_ID, a.SAP_VENDOR_ID, a.RELEASE_DATE, 
 a.REMOVED_DATE, a.IS_DRAFT, a.DATA_STATE  from 
 (select p.ID, p.EAN, p.NAME, p.SAP_CATEGORY_ID, p.SAP_VENDOR_ID, p.RELEASE_DATE, 
 p.REMOVED_DATE, p.IS_DRAFT,  p.DATA_STATE from PRODUCTS as p   order by p.EAN, p.IS_DRAFT) as a group by a.EAN )
 as b  left join PRODUCT_LIFECYCLE_STATES pl on pl.PRODUCT_ID = b.ID  group by b.ID ) as d left join PRODUCT_ATTRIBUTE_VALUES
 AS PRODAV ON ID=PRODAV.PRODUCT_ID AND PRODAV.ATTRIBUTE_VALUE_ID IN
 (select ID from ATTRIBUTE_VALUES where ATTRIBUTE_CODE='APPROVED_ATTRIBUTES') 
 left join ATTRIBUTE_VALUES AS ATVALS ON PRODAV.ATTRIBUTE_VALUE_ID = ATVALS.ID AND ATVALS.ATTRIBUTE_CODE ='APPROVED_ATTRIBUTES'
 ORDER BY d.SAP_CATEGORY_ID, d.NAME ) f

这是我收到的错误:

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'a.ID' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

我已经尝试过更改SQL_MODE,但是更改查询后,它不会返回任何输出并继续加载。

2 个答案:

答案 0 :(得分:1)

要解决该错误,请连接到mysql服务器:

mysql -u root -p

执行显示sql_mode值的查询:

show variables like 'sql_mode';

在我面前显示:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

使用这些值复制字符串,删除“ ONLY_FULL_GROUP_BY”并执行查询:

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

根据此请求,我们禁用了“ ONLY_FULL_GROUP_BY”,此后将不会显示错误。

然后我们退出mysql:

exit

为使此错误以后不再出现,我们需要打开MySQL配置文件。例如,在文本编辑器nano中(Ctrl + X表示退出,y / n表示保存或取消更改):

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

我的文件中没有sql_mode =,因此在文件末尾插入了具有以前复制的值的行,从中删除了ONLY_FULL_GROUP_BY,在我的情况下,发生了以下情况:

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以应用更改:

sudo service mysql restart

应该做;)。

答案 1 :(得分:0)

您需要禁用ONLY_FULL_GROUP_BY

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