【问题标题】:Laravel : Syntax error or access violation: 1055 ErrorLaravel:语法错误或访问冲突:1055 错误
【发布时间】:2017-04-16 11:27:52
【问题描述】:

我想在同一个查询中使用 WhereIn 和 Groupby 来获取 Result。

我试过了:

$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();

但我收到此错误消息:

SQLSTATE[42000]:语法错误或访问冲突:1055 'sbrtpt.loading.id' 不在 GROUP BY 中(SQL:select * from loading where id in (14, 15, 16) group by vehicle_no)

【问题讨论】:

  • 切换你的 groupBy 和 whereIn 语句
  • 它不工作@aynber
  • 你能打印完整的错误信息吗?
  • SQLSTATE[42000]: 语法错误或访问冲突: 1055 'sbrtpt.loading.id' 不在 GROUP BY 中(SQL: select * from loading where id in (14, 15, 16) 分组vehicle_no) @aynber

标签: php laravel laravel-5 qsqlquery


【解决方案1】:
SQLSTATE[42000]: Syntax error or access violation: 1055  in GROUP BY

如果您收到上述错误,请将以下内容添加到 config 文件夹中的 database.php 文件中:

'mysql' => [
    'strict' => true,
    'modes' => [
        'STRICT_TRANS_TABLES',
        'NO_ZERO_IN_DATE',
        'NO_ZERO_DATE',
        'ERROR_FOR_DIVISION_BY_ZERO',
        'NO_AUTO_CREATE_USER',
        'NO_ENGINE_SUBSTITUTION'
    ],
]

【讨论】:

    【解决方案2】:

    您可以离开'strict' => true,并在“mysql”选项中添加模式。

    'mysql' => [
       ...
       ....
       'strict' => true,
       'modes' => [
            //'ONLY_FULL_GROUP_BY', // Disable this to allow grouping by one column
            'STRICT_TRANS_TABLES',
            'NO_ZERO_IN_DATE',
            'NO_ZERO_DATE',
            'ERROR_FOR_DIVISION_BY_ZERO',
            // 'NO_AUTO_CREATE_USER', // This has been deprecated and will throw an error in mysql v8
    
            'NO_ENGINE_SUBSTITUTION'
        ],
     ]
    

    【讨论】:

      【解决方案3】:

      这是在 laravel doc 8.x 上,效果很好

       $users = DB::table('users')
                   ->select(DB::raw('count(*) as user_count, status'))
                   ->where('status', '<>', 1)
                   ->groupBy('status')
                   ->get();
      

      【讨论】:

        【解决方案4】:

        无需更改系统中的任何位置,只需使用 laravel 中的代码

        \DB::statement("SET SQL_MODE=''");//this is the trick use it just before your query
        
        $data=Task::where('user_id', Auth::user()->id)->where('status', 0)->groupBy('task_code')->get(['id','task_code', 'title']);
        

        【讨论】:

        • 感谢这就像魅力 \DB::statement("SET SQL_MODE=''");
        • 谢谢,一直在搜索和尝试所有其他解决方案,但对我不起作用。您的解决方案很简单且有效。非常感谢
        • 我很高兴@KyusufMuhammad 先生和 Vinit Kadkol 先生。
        • 谢谢,工作就像一个魅力
        • 谢谢@SkBindas,它也对我有用。另外我认为这是最好的解决方案,因为它不会改变全局设置。
        【解决方案5】:

        不修改config\database.php文件

        config\database.php 中设置'strict' =&gt; false 可能是一个安全问题。因此,一个简单的 Laravel 解决方案可能是先调用get(),然后再调用groupBy('vehicle_no)

        $loadids = explode("#@*", $reciptdet->loading_id);
        $loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get();
        $grouped = $loadingdatas->groupBy('vehicle_no');
        

        【讨论】:

        • 当 'strict' => false 时我无法得到正确的结果。如果您在查询时尝试分组数据,则此解决方案效果很好。谢谢你的回答。
        【解决方案6】:

        你不妨使用:

        distinct('vehicle_no')

        每个案例场景都不同,而不是 groupBy('vehicle_no'),但是查看您的查询,不同的可能是要走的路,因为您没有聚合数据。

        【讨论】:

          【解决方案7】:

          \Schema::defaultStringLength(191); 添加到boot 方法

          class AppServiceProvider extends ServiceProvider
          {
              /**
               * Register any application services.
               *
               * @return void
               */
              public function register()
              {
                  //
              }
          
              /**
               * Bootstrap any application services.
               *
               * @return void
               */
              public function boot()
              {
                  //
                   \Schema::defaultStringLength(191);
              }
          }
          

          【讨论】:

            【解决方案8】:

            更新config/database.php

            设置:

            'mysql' => [
                       'strict' => false,
                    ],
            

            代替:

            'mysql' => [
                       'strict' => true,
                    ],
            

            别忘了清除缓存:

            php artisan config:cache
            

            【讨论】:

            • 除了在 2016 年得到回复,如果我能投票给你一千次,我会的。在没有任何线索的情况下敲打它大约 24 小时。爱你的男人
            【解决方案9】:

            这个限制是有意义的,因为当您在 MySQL 中使用 GROUP BY 时,它会为 GROUP BY 中使用的列中的每个值返回一行。因此,所选行中其他列的值在任何地方都没有意义。因此,始终建议使用最佳实践,我建议不要禁用 MySQL 严格模式。

            开发人员通常可能需要按列的值对查询的行进行分组。在这里,他们不需要每个列的唯一值只需要一行。但是它们需要按特定列的唯一值分组的多行。由于某种原因,他们使用 Laravel 的 groupBy Query Builder 方法生成 MySQL GROUP BY 查询,开发人员遇到上述错误。

            他们的问题的解决方案是改用groupBy Collection 方法。例如,

            $loadingData = DB::table('loading')
                ->whereIn('id', $loadIds)
                ->get()
                ->groupBy('vehicle_no');
            

            这会给他们想要的结果。

            【讨论】:

              【解决方案10】:

              我也遇到了这个问题,但是在将'strict' =&gt; true更改为'strict' =&gt; false后,错误消失了。

              您可以在以下位置找到此设置:

              config\database.php

              'mysql' => [
                  ...
                  'strict' => false,
                  ...
              ]
              

              【讨论】:

              • 我们如何在 laravel 中为 oracle 连接做到这一点
              【解决方案11】:

              在 eloquent 中使用 groupBy 时,始终在 select() 函数中包含 groupBy 函数中使用的列名。

              $loadids=explode("#@*",$reciptdet->loading_id);
              $loadingdatas=DB::table('loading')->select('vehicle_no')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();//add select('vehicle_no')
              

              在配置文件中禁用严格模式也是一种不好的做法。这样做可能会导致损坏的数据进入数据库,例如没有任何警告的无效日期。除非绝对必要,否则不要这样做。

              【讨论】:

              • 添加 ->select('column') 对我有用。谢谢哥们:)
              【解决方案12】:

              简答

              config\database.php --> "mysql" 数组中

              设置'strict' =&gt; false 禁用所有。

              .... 或

              您可以离开'strict' =&gt; true 并在

              中为"mysql" 选项添加模式
              'mysql' => [
                     ...
                     ....
                     'strict' => true,
                     'modes' => [
                          //'ONLY_FULL_GROUP_BY', // Disable this to allow grouping by one column
                          'STRICT_TRANS_TABLES',
                          'NO_ZERO_IN_DATE',
                          'NO_ZERO_DATE',
                          'ERROR_FOR_DIVISION_BY_ZERO',
                          'NO_AUTO_CREATE_USER',
                          'NO_ENGINE_SUBSTITUTION'
                      ],
               ]
              

              详细解答

              您可能不需要禁用所有 strict 选项... 请查看此answer 关于此问题。

              【讨论】:

              • 感谢您提供出色的解决方案。这个问题杀死了我 3 个小时
              • 如何在 laravel 中的 oracle 连接上将此严格模式设置为 false?请帮帮我
              • 这成功了!!!对于更改该设置后仍然出现相同错误的任何人,请尝试通过运行 php artisan config:cache 来清除配置缓存
              • 我对这种硬编码的解决方法的担忧是,我觉得某种技术债务不会让我晚上睡个好觉,因为那种会浮现在我脑海中的问题会就像:当 Laravel 和/或 MySQL 规范更改 modes 时会发生什么(例如,添加/删除该数组中指定的某些模式,或者更糟糕的是,该数组中指定的模式之一的名称更改) .所以,我只是离开strict=true,不会碰任何mode 的东西。我宁愿更新我的代码以使用如此严格的设置。 ThisPractice === SleepWellEveryNight :)
              • 更好的解决方案是编写更好的 SQL
              【解决方案13】:

              这可能是SQL_MODE 问题。在你的config/database.php,在连接中,改变

              strict => false
              

              'mysql' => [
                  'driver' => 'mysql',
                  'host' => env('DB_HOST', 'localhost'),
                  'port' => env('DB_PORT', '3306'),
                  'database' => env('DB_DATABASE', 'forge'),
                  'username' => env('DB_USERNAME', 'forge'),
                  'password' => env('DB_PASSWORD', ''),
                  'charset' => 'utf8',
                  'collation' => 'utf8_unicode_ci',
                  'prefix' => '',
                  'strict' => false,
                  'engine' => null,
              ],
              

              【讨论】:

              • 在这种方法中可以产生任何安全问题@Antonio Carlos Ribeiro
              • 我相信它是安全的,否则你将无法在 Laravel 上禁用它。
              • 应用更改后不要忘记执行此命令:php artisan config:cache
              猜你喜欢
              • 2019-06-06
              • 2017-07-31
              • 2018-05-31
              • 2020-06-16
              • 2017-02-01
              • 2017-04-01
              • 1970-01-01
              • 2019-02-10
              • 2023-04-01
              相关资源
              最近更新 更多