only_full_group_by模式有什么好处?

时间:2017-08-03 12:21:51

标签: mysql sql

我更新了mysql,我从MySQL版本5.6.17升级到版本5.7.14

因为我的SQL查询有错误

确实,我的许多查询都是这样的:

SELECT count (id) as nbr, lic from prep WHERE key = '18'

我有这个错误:

  

1140 - 在没有GROUP BY的聚合查询中,SELECT列表的表达式#2包含非聚合列' operator.preparation.orig_lic&#39 ;;   这与sql_mode = only_full_group_by

不兼容

经过一些研究,我得知Mysql 5.7.14默认激活ONLY_FULL_GROUP_BY

为什么默认启用?

什么是最佳解决方案(性能)?禁用ONLY_FULL_GROUP_BY或按'添加'组在我的查询?

谢谢

3 个答案:

答案 0 :(得分:8)

only_full_group_by = on 告诉 MySQL 引擎:当您怀疑要显示什么结果并抛出错误时,不要应用 GROUP BY。仅当命令明确告诉您要做什么时才应用它。即当命令完整且完整时!

only_full_group_by = off 告诉 MySQL 引擎:始终应用 GROUP BY,如果您对选择的结果有疑问,请随机选择一个!

如果您正确使用 GROUP BY,您不会关闭它!

示例:

表:用户

 id   |  name
----------------
  1      ali
  2      john
  3      ali

当您在 GROUP BY 列上使用 name 时:

SELECT * FROM users GROUP BY name;

有两种可能的结果:

  1      ali
  2      john     

  2      john
  3      ali

MYSQL 不知道选择什么结果!因为有不同的 id,但都有 name=ali

解决方案 1:

仅选择 name 字段:

SELECT name FROM users GROUP BY name;

结果:

  ali
  john     

这是一个完美的解决方案。删除使 GROUP BY 混淆的列。这意味着你知道你在做什么。通常,您不需要
那些列,但如果您需要它们,请转到解决方案 3!

解决方案 2:

关闭only_full_group_by。 MYSQL 会随机显示两种可能结果之一! (如果你真的不在乎它会选择什么id也没关系)

解决方案 3

使用 Aggregate 之类的 MIN() 函数,MAX() 来帮助 MYSQL 决定它必须选择什么。

例如,我想要最小的 id

SELECT MIN(id), name FROM users GROUP BY name;

结果:

  1      ali
  2      john     

它将选择具有最小 aliid 行。

答案 1 :(得分:3)

正确的解决方案是添加第i列

! polytest.F90
! Test calculation of a bivariate polynomial.

program main

  implicit none
  integer, parameter :: dbl = kind(1.d0)
  integer, parameter :: nx = 3, ny = 2
  real(dbl), parameter :: x0 = 0.0002500000000011937, &
                          y0 = -0.0010071334522899211
  real(dbl), dimension(0:nx,0:ny) :: coeffs
  real(dbl) :: z, xj, yk, curr
  integer :: j, k

  ! Define polynomial coefficients
  coeffs(0,0) = 101.34274313967416d0
  coeffs(0,1) = 100015.695367145d0
  coeffs(0,2) = -2544.5765420363d0
  coeffs(1,0) = 5.9057834791235253d0
  coeffs(1,1) = -270.983805184062d0
  coeffs(1,2) = 1455.0364540468d0
  coeffs(2,0) = -12357.785933039d0
  coeffs(2,1) = 1455.0364540468d0
  coeffs(2,2) = -756.558385769359d0
  coeffs(3,0) = 736.741204151612d0
  coeffs(3,1) = -672.50778314507d0
  coeffs(3,2) = 499.360390819152d0

  ! Calculate polynomial by looping over powers of x, y
  z = 0d0
  xj = 1d0
  do j = 0, nx-1
    yk = 1d0
    do k = 0, ny-1
      curr = coeffs(j,k) * xj * yk
      z = z + curr
      yk = yk * y0
    enddo
    xj = xj * x0
  enddo

  ! Print result
  WRITE(*,*) z   ! 0.61436839888538231

end program

表示这取决于指数yoy所具有的

ONLY_FULL_GROUP_BY是SQL中聚合函数的正常行为,采用5.7是为了避免对非aggegated列结果的随意结果产生歧义。

答案 2 :(得分:3)

“最佳”解决方案是通过添加group by来执行正确的操作并修复查询,而不是覆盖引发的错误。如果您使用ONLY_FULL_GROUP_BY覆盖错误,则您的体验会消失,但您可能会因此而遇到两个新错误:

  1. 包含非聚合值的聚合值的意外结果,即您的错误试图阻止的问题。

  2. 无法在其他环境中执行查询。如果您需要切换设置或将代码提供给不使用此数据库的其他人,则查询将再次抛出错误。如果您养成了覆盖错误或其他错误的习惯,那么您的代码可能会对其他人无法使用,并严重削弱其有用性。

  3. 通常,如果您收到错误,请修复它,而不是仅仅告诉编译器/优化器忽略它。