MySQL5.7之后,sql_mode中ONLY_FULL_GROUP_BY模式默认设置为打开状态。
ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,简单的说来,在此模式下,target list中的值要么是来自于聚合函数(sum、avg、max等)的结果,要么是来自于group by list中的表达式的值。
MySQL提供了any_value()函数来抑制ONLY_FULL_GROUP_BY值被拒绝,下面来看下这个函数的具体作用。
1、在mysql中建表并插入测试数据:


参数ONLY_FULL_GROUP_BY默认开启时,若select列表中的字段与group by后的字段不全相同,则会报错:
然后使用any_value函数看下具体效果:
从图中可以看出,any_value函数在ONLY_FULL_GROUP_BY模式开启的情况下,按照id分组后,若每个分组对应多条数据,则会自动选择展示每个分组的第一条数据。
2、在xugu中建表并插入测试数据:


xugu暂不支持any_value函数:
下面使用开窗函数实现相同效果:
这种写法是根据id分组并排序后,选择每组排序后的第一条数据,效果近似与any_value,实际情况下根据需要可选择增减排序条件。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




