标签 only_full_group_by 下的文章

You cannot use the alias '' of an expression containing a window function in this context.

抛出这个错误一般是你使用窗口函数后直接在where子句里引用了窗口函数的结果,但是窗口函数的计算是在where子句之后才执行的,所以sql会抛出异常 ,那么该怎么解决这个问题呢?

1.使用子查询
2.使用 with的方法

如:
子查询的方式

select title,(select name from clas where id=top.cid)cname,view from (SELECT title,cid,view,row_number () over ( PARTITION BY `cid` ORDER BY view desc ) t  from book)top where t=1

with的方式

with top as(
SELECT title,cid,view,row_number () over ( PARTITION BY `cid` ORDER BY view desc ) t  from book)
select title,(select name from clas where id=top.cid)cname,view from top where t=1;

上述语句是从数据库中查询每个分类中点击最多的书,由此可以优雅的看出各个分类中那一本书最受欢迎。
而如果我们使用group by 来做类似的求值 一般会出现only_full_group_by的错误提示,而且也不好处理

mysql8 only_full_group_by 的解决办法

Error Code: 1055. Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'table.key' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

以上是报错信息,根据这个报错信息 在网海里捞了一捞,发现大部分的结果都是类似这样的

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';

然而设置了却没有起作用.
正确的设置方法 如下:

set @@session.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

当然sql_mode 的值 最好根据

select  @@global.sql_mode  得到的结果 做修改.把得到的值 中的ONLY_FULL_GROUP_BY去掉

还有另外一个解决办法 就是通过 any_value()这个内置函数

SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;

在这种情况下,MySQL 会忽略address每个name组中值 的不确定性 并接受查询。如果您根本不关心为每个组选择非聚合列的哪个值,这可能很有用。 ANY_VALUE()不是聚合函数,与SUM()或 等函数不同 COUNT()。它只是起到抑制非确定性测试的作用。

文档中给出了抛出这个错误的3种解决办法分别是:

1.更改表以创建name主键或唯一NOT NULL列
2.使用any_value
3.禁用 ONLY_FULL_GROUP_BY

参考:https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_any-value