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

时间:2016-12-01 17:48:21

标签: php laravel laravel-5

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

我试过这个:

import random

my_list = []
for i in range(100):
    my_list.append(random.randint(0,1000))          

def my_max(my_list):
    #sort list from least to greatest
    my_list.sort()
    #get last item in list (max value)
    my_max = my_list.pop()

    return my_max

print my_max(my_list)

但我收到此错误消息:

  

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

13 个答案:

答案 0 :(得分:97)

这可能是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,
],

答案 1 :(得分:86)

简短回答

config\database.php - &gt; "mysql"数组

设置'strict' => false以禁用所有。

....或

您可以离开'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',
            'NO_ENGINE_SUBSTITUTION'
        ],
 ]

详细答案

您可能不需要停用所有严格选项... 请关注此问题answer

答案 2 :(得分:8)

无需更改系统中的任何位置,只需使用 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']);

答案 3 :(得分:4)

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

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

<强>设置\ database.php中

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

答案 4 :(得分:3)

更新config/database.php

设置:

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

代替:

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

并且不要忘记清除缓存:

php artisan config:cache

答案 5 :(得分:2)

每当雄辩地使用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')

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

答案 6 :(得分:2)

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

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

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

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

这将为他们提供所需的结果。

答案 7 :(得分:1)

不修改config \ database.php文件

'strict' => false中设置

设置config\database.php 可能是安全问题。因此,一个简单的Laravel解决方案可以是首先调用get(),然后依次调用groupBy('vehicle_no)

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

答案 8 :(得分:1)

这是在 laravel doc 8.x 上,它运行良好

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

答案 9 :(得分:0)

您最好使用:

distinct('vehicle_no')

每种情况都与groupBy('vehicle_no')不同,但是从查询的角度来看,由于您不汇总数据,因此可能会采取与众不同的方式。

答案 10 :(得分:0)

您可以保留 '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'
    ],
 ]

答案 11 :(得分:0)

SQLSTATE[42000]: Syntax error or access violation: 1055  in GROUP BY

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

'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'
    ],
]

答案 12 :(得分:-1)

\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);
    }
}