Mysql 仅按模式分组的好处是什么?
我更新了mysql,从mysql 5.6.17版升级到5.7.14版 因为我的sql查询有错误 事实上,我的许多问题都是这样的:Mysql 仅按模式分组的好处是什么?,mysql,sql,Mysql,Sql,我更新了mysql,从mysql 5.6.17版升级到5.7.14版 因为我的sql查询有错误 事实上,我的许多问题都是这样的: SELECT count (id) as nbr, lic from prep WHERE key = '18' 我有一个错误: 1140-在没有分组依据的聚合查询中,选择列表的表达式#2包含未聚合列“operator.preparation.orig_lic”; 这与sql\u mode=only\u full\u group\u by不兼容 经过一些研究,我了解
SELECT count (id) as nbr, lic from prep WHERE key = '18'
我有一个错误:
1140-在没有分组依据的聚合查询中,选择列表的表达式#2包含未聚合列“operator.preparation.orig_lic”;
这与sql\u mode=only\u full\u group\u by不兼容
经过一些研究,我了解到Mysql 5.7.14在默认情况下只激活组
为什么默认情况下会启用它
最佳解决方案(性能)是什么?仅禁用\u FULL\u GROUP\u BY或在我的查询中添加“GROUP BY”
谢谢正确的解决方案是添加您分组的列:
SELECT count (id) as nbr, lic
from prep
WHERE key = '18'
group by lic
对于性能,这取决于您拥有的索引
ONLY\u FULL\u GROUP\u BY
是SQL中聚合函数的正常行为,采用的是5.7,以避免非聚合列结果的偶然结果不明确。最好的解决方案是做正确的事情,通过添加groupby
来修复查询,而不是覆盖抛出的错误。如果您通过仅用_FULL _GROUP _覆盖该错误,您遇到的错误将消失,但这样做可能会导致两个新错误:
一般来说,如果您收到错误,请修复它,而不仅仅是告诉编译器/优化器忽略它。只有_full\u group\u by=on告诉MySQL引擎:当您对要显示的结果有疑问并抛出错误时,不要应用
group by
。仅当命令明确告诉您要做什么时才应用它。i、 e.当命令已满且完成时
only_full\u group\u by=off告诉MySQL引擎:始终应用
group by
,如果您对选择的结果有疑问,只需随机选择一个
如果您正确使用分组依据
,则不会将其关闭强>
示例:
表:用户
id | name
----------------
1 ali
2 john
3 ali
在名称
列上使用分组依据
时:
SELECT * FROM users GROUP BY name;
有两种可能的结果:
1 ali
2 john
或
MYSQL不知道选择什么结果!因为有不同的id
s,但两者都有name=ali
解决方案1:
仅选择名称
字段:
SELECT name FROM users GROUP BY name;
结果:
ali
john
1 ali
2 john
这是一个完美的解决方案。删除使分组依据
混乱的列。这意味着你知道你在做什么。通常,您不需要这些列,但如果需要,请转到解决方案3 解决方案2: 关闭
仅\u满\u组\u by
。MYSQL将随机向您显示两个可能结果中的一个!!(如果你真的不在乎它会选择什么id
,那也没关系)
解决方案3
使用Aggregate
函数,如MIN()
,MAX()
,帮助MYSQL决定必须选择什么
例如,我想要最小的id
:
SELECT MIN(id), name FROM users GROUP BY name;
结果:
ali
john
1 ali
2 john
它将选择
ali
行,该行具有最小的id
仅\u full\u group\u按强制您按原因命名组中的所有选择字段。。这样,您就不会编写不命名所有字段的错误分组查询。。。阅读这篇@RaymondNijland关于分组模式的伟大文章“仅限完整分组”。我一直在寻找这样的演讲。非常感谢你!!!谢谢你,但是它改变了一些事情,通过在id或lic上进行分组?完全改变。。您在group by中设置的列将用作聚合键。。因此,例如:如果您想要使用相同lic的行数,请使用group by lic。。否则,如果需要另一列的行数,则不需要输入另一列名称。。如果您的情况是,您正在按LIC计算非空id组的数量,谢谢您,但在这样的查询中:选择user_name,validated.user,via,master,nb_jours,min(date)作为date_min from validated,users\u指令,其中是\u finish=0和user=cust\u id和users\u指令。br=validated.br按主订单按日期分组\u min ASC我不能使用分组依据?使用分组依据在分组依据中,您应该在分组依据中拥有聚合函数中未包含的所有列(user\u name,validated.user,via,master,nb\u jours)而不仅仅是主。。但这似乎是一个新的要求。。通过不总是返回我们想要的内容,尝试添加一个新问题,其中包含适当的数据样本和预期的结果分组。例如,选择sum(amount)作为totalAmount,如果(action=“+”,amount,0)作为从
transactions`where account\u id=32099`进行的合计,则此查询仅使用“FULL\u GROUP\u BY”模式,需要使用GROUP BY action
。这使得合计变得无用,因为它将返回多行。