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

时间:2018-09-06 01:54:15

标签: laravel

熟悉此Laravel错误的人:

  

“ SQLSTATE [42000]:语法错误或访问冲突:1140如果没有GROUP BY子句,则将GROUP列(MIN(),MAX(),COUNT(),...)与GROUP列混合使用是非法的(SQL:选择办公室,将feedback中的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);

2 个答案:

答案 0 :(得分:1)

您必须使用groupBy()

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

答案 1 :(得分:1)

虽然使用 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'),
        ]) : [],
    ],