Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 仅按模式分组的好处是什么?_Mysql_Sql - Fatal编程技术网

Mysql 仅按模式分组的好处是什么?

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不兼容 经过一些研究,我了解

我更新了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不兼容

经过一些研究,我了解到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
    。这使得合计变得无用,因为它将返回多行。