我更新了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或按'添加'组在我的查询?
谢谢
答案 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
它将选择具有最小 ali
的 id
行。
答案 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
覆盖错误,则您的体验会消失,但您可能会因此而遇到两个新错误:
包含非聚合值的聚合值的意外结果,即您的错误试图阻止的问题。
无法在其他环境中执行查询。如果您需要切换设置或将代码提供给不使用此数据库的其他人,则查询将再次抛出错误。如果您养成了覆盖错误或其他错误的习惯,那么您的代码可能会对其他人无法使用,并严重削弱其有用性。
通常,如果您收到错误,请修复它,而不是仅仅告诉编译器/优化器忽略它。