Laravel 错误:1140 混合 GROUP 列(MIN()、MAX()、COUNT()

jua*_*uel 5 laravel

任何熟悉此 Laravel 错误的人:

“SQLSTATE[42000]:语法错误或访问冲突:1140 如果没有 GROUP BY 子句,则 GROUP 列(MIN()、MAX()、COUNT(),...)与没有 GROUP 列的混合是非法的(SQL:从feedback)中选择 office,avg(q1) 作为 q1,avg(q2) 作为 q2

这是我的控制器代码:

$feedback_data = DB::table('feedback')
    ->select(DB::raw('office, avg(q1) as q1, avg(q2) as q2'))
    ->get();
return view('/feedback/index')->with('feedback_data', $feedback_data);
Run Code Online (Sandbox Code Playgroud)

Har*_*hil 9

使用时MIN(),MAX(),COUNT() AVG()类似聚合函数时,您必须使用GROUP BY,但根据最新MYSQL版本,您必须将选择查询中的所有列用作GROUP BY.

因此,为了解决这个错误,有两种方法:

  1. 您可以使用GROUP BY在相关栏目上使用。

  2. config/database.php您可以通过将其设置为来禁用严格模式false

GROUP BY已经在此处给出的答案之一中显示,因此我们将讨论严格模式,因此 laravel 的严格模式为true默认情况下具有严格模式,该模式不允许在单列上进行分组,因此false如果您想要分组依据,则必须将严格模式设置为在单列上。

禁用“严格”模式,返回到 <=MYSQL 5.6行为,同时启用“严格”模式,将其设置为该MYSQL 5.7行为,我们希望禁用它,因为禁用它将允许我们在单列上进行分组。

因此,要设置严格模式,请转到config/database.php并将严格模式设置为false

'mysql' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'prefix_indexes' => true,
        'strict' => false, //it will be true by default set this to false
        'engine' => null,
        'options' => extension_loaded('pdo_mysql') ? array_filter([
            PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        ]) : [],
    ],
Run Code Online (Sandbox Code Playgroud)


Jon*_*eir 4

你必须使用groupBy()

$feedback_data = DB::table('feedback')
    ->select(DB::raw('office, avg(q1) as q1, avg(q2) as q2'))
    ->groupBy('office')
    ->get();
Run Code Online (Sandbox Code Playgroud)