ONLY_FULL_GROUP_BY超详细解决方案

ONLY_FULL_GROUP_BY
网上都有好多说法,说什么那个版本之上会默认开启ONLY_FULL_GROUP_BY,我们不用管自己的是那个版本,我们直接通过命令查询是否开启了ONLY_FULL_GROUP_BY
mysql官网详解ONLY_FULL_GROUP_BY
You can achieve the same effect without disabling ONLY_FULL_GROUP_BY by using ANY_VALUE() to refer to the nonaggregated column.(您可以在不禁用ONLY_FULL_GROUP_BY的情况下,通过使用ANY_VALUE()引用非聚合列来达到相同的效果。)

本文提供三种解决方案,更改mysql配置文件(mini),使用ANY_VALUE(),通过group by所有字段

查询命令:

select version(), @@sql_mode;

在这里插入图片描述

select @@GLOBAL.sql_mode;

在这里插入图片描述

修改:

–注意:修改只针对当前会话有效,重启mysql后失效
要想永久有效改mini配置文件,配置怎么修改此处不提供方法

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

原sql

SELECT
	gm.goods_id,
	gm.goods_name AS goodsName,
	gm.image,
	gir.terminal_no AS terminalNo,
	gir.region_id,
	SUM( gir.available_num ) AS onShelvesNum
FROM
	goods_management gm
	LEFT JOIN goods_onshelves_info gir ON gm.goods_id = gir.goods_id
WHERE
	gir.available_num IS NOT NULL 
GROUP BY
	gir.region_id,
	gm.goods_id

解决方法1:group by 所有字段,如果你group by 后面是主键,是不会有问题的

(下面这种用法可能会影响你的结果,但是你得了解)

--如果sql语句中有group by,我们需要指定所有的列,聚合函数可以不用指定
--列中有聚合函数的时候,要通过group by来指定对应的结果集的列,除了聚合函数不用指定
SELECT
	gm.goods_id,
	gm.goods_name AS goodsName,
	gm.image,
	gir.terminal_no AS terminalNo,
	gir.region_id,
	SUM( gir.available_num ) AS onShelvesNum
FROM
	goods_management gm
	LEFT JOIN goods_onshelves_info gir ON gm.goods_id = gir.goods_id
WHERE
	gir.available_num IS NOT NULL 
GROUP BY
	gir.region_id,
	gm.goods_id,
	goodsName,
	terminalNo

解决方法2:加any_value()

SELECT
	gm.goods_id,
	any_value ( gm.goods_name ) AS goodsName,
	any_value ( gm.image ),
	any_value ( gir.terminal_no ) AS terminalNo,
	gir.region_id,
	SUM( gir.available_num ) AS onShelvesNum,
FROM
	goods_management gm
	LEFT JOIN goods_onshelves_info gir ON gm.goods_id = gir.goods_id
WHERE
	gir.available_num IS NOT NULL 
GROUP BY
	gir.region_id,
	gm.goods_id
  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值