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 where status = 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' =&gt; 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 中从 falsetrue 的切换的猜测是 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 子句中使用了非分组字段“距离”的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:语法错误或访问冲突:1055 错误

SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误 - LARAVEL

Laravel 5.8 SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误

为啥我是 laravel 抛出 SQLSTATE[42000]:语法错误或访问冲突:1064 错误

Laravel 迁移语法错误或访问冲突 1064

Laravel 6 - SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;