【问题标题】:Laravel 5.3: Syntax error or access violation: 1463 Non-grouping field 'distance' is used in HAVING clauseLaravel 5.3:语法错误或访问冲突:1463 HAVING 子句中使用了非分组字段“距离”
【发布时间】: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 工作台中运行良好。 怎么回事?

【问题讨论】:

    标签: mysql laravel eloquent


    【解决方案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 中从 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 语句中包含所有选定的列,或者只选择“距离”列。
        猜你喜欢
        • 2016-03-27
        • 2019-02-10
        • 2017-04-16
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-31
        • 2017-10-29
        相关资源
        最近更新 更多