Laravel 5.3:语法错误或访问冲突:1463 HAVING 子句中使用了非分组字段“距离”
Posted
技术标签:
【中文标题】Laravel 5.3:语法错误或访问冲突:1463 HAVING 子句中使用了非分组字段“距离”【英文标题】:Laravel 5.3: Syntax error or access violation: 1463 Non-grouping field 'distance' is used in HAVING clause 【发布时间】:2016-12-27 11:00:16 【问题描述】:这个错误是在将整个源代码移动到 5.3 版本后出现的,我现在已经摸不着头脑了。
所以我有这样一个雄辩的查询:
POI::select('*', DB::raw("SQRT( POW((x - $this->x),2) + POW((y - $this->y),2) ) AS distance"))
->where('status', Config::get('app.poi_state.enabled'))
->whereNotIn('id', $excludePOIList)
->having('distance', '<=', $distance)
->orderBy('distance')->get();
它在升级之前发现它现在抛出:
语法错误或访问冲突:1463 非分组字段“距离” 在 HAVING 子句中使用 (SQL: select *, SQRT( POW((x - 860.0000),2) + POW((y - 105.0000),2) ) AS distance from
poi
wherestatus
= 1 and @987654324 @ not in (1) 有distance
distance asc)
我想检查我的服务器上是否启用了 ONLY_FULL_GROUP_BY 模式,但它没有...
选择@@sql_mode NO_ENGINE_SUBSTITUTION
相同的查询在 mysql 工作台中运行良好。 怎么回事?
【问题讨论】:
【参考方案1】:您必须更改您的 database.php 文件。只需转到 config/database.php。制作
'strict' => false
.
如果它是“真的”。那么您必须需要清除配置。为此,只需运行
php artisan optimize:clear
.
就是这样
【讨论】:
【参考方案2】:在mysql连接中的config/database.php文件中检查strict为false:
'strict' => false,
如果为真,则输入假。
【讨论】:
就是这样,显然L 5.3默认启用严格模式 谢谢,但是关于这个strict
选项的作用以及它有什么副作用的任何解释?
严格模式控制 MySQL 如何处理数据更改语句(如 INSERT 或 UPDATE)中的无效或缺失值。一个值可能由于多种原因而无效。例如,它可能具有错误的列数据类型,或者可能超出范围。当要插入的新行不包含在其定义中没有显式 DEFAULT 子句的非 NULL 列的值时,缺少值。 (对于 NULL 列,如果缺少值,则插入 NULL。)严格模式也会影响 DDL 语句,例如 CREATE TABLE。 dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-strict
超级奇怪,但我们的服务器使用 MySQL 5.6,而我的本地环境使用 5.7。在 5.7 上本地使用 strict 可以工作,但在 5.6 上无法生产。我对 L5.3 中从 false
到 true
的切换的猜测是 MySQL 5.7 附带了一个更新,该更新可能修复了严格模式下的错误或其他什么......无论如何,这个解决方案对我有用。是时候升级我们的 MySQL 版本了!
这不应该是正确的答案,禁用严格模式不是解决方案,只能避免问题...【参考方案3】:
我不知道为什么您在升级之后但之前没有出现该错误。但是,您可以将距离条件移动到 WHERE 子句中:
->where(DB::raw("SQRT( POW((x - $this->x),2) + POW((y - $this->y),2) ) "), '<=', $distance)
【讨论】:
【参考方案4】:尝试在距离字段上使用 group by 子句。
POI::select('*', DB::raw("SQRT( POW((x - $this->x),2) + POW((y - $this->y),2) ) AS distance"))
->where('status', Config::get('app.poi_state.enabled'))
->whereNotIn('id', $excludePOIList)
->groupBy('distance')
->having('distance', '<=', $distance)
->orderBy('distance')->get();
【讨论】:
它不起作用,因为同样的严格规则(only_full_group_by)适用于上述查询。在这种情况下,您必须在 groupBy 语句中包含所有选定的列,或者只选择“距离”列。以上是关于Laravel 5.3:语法错误或访问冲突:1463 HAVING 子句中使用了非分组字段“距离”的主要内容,如果未能解决你的问题,请参考以下文章
SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误 - LARAVEL
Laravel 5.8 SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误