ONLY_FULL_GROUP_BY超详细解决方案
ONLY_FULL_GROUP_BY 网上都有好多说法,说什么那个版本之上会默认开启ONLY_FULL_GROUP_BY,我们不用管自己的是那个版本,我们直接通过命令查询是否开启了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