【问题标题】:A.* isn't in GROUP BY with left join on laravel query builderA.* 不在 GROUP BY 中,在 laravel 查询生成器上使用左连接
【发布时间】:2023-04-10 19:38:02
【问题描述】:
   $search_alls=
    DB::table('a16s as A')
    ->select('A.id')
    // ->select('A.*')
    ->addSelect(DB::raw('SUM(CASE WHEN B.approve = 1 ELSE 0 END) as Yshow'))
    ->leftjoin('a16s_likes as B', function($join) {
        $join->on('A.id', '=', 'B.p_id');
        })
    ->groupBy('A.id')
    ->get();

当我使用上面的 select('A.id') 时效果很好。

但是当我使用 select('A.*') 来选择所有 A cloumn 我得到了错误

SQLSTATE[42000]: Syntax error or access violation: 1055 'employee.A.name' isn't in GROUP BY 

PS:employee 是我的数据库名称 A表上的列是

id name ....
1  john
2  mary
3  susan

如何通过leftjoin选择所有列? A.id 列与 B.p_id 列是一对多的关系。

【问题讨论】:

标签: mysql laravel group-by left-join laravel-query-builder


【解决方案1】:

要解决此问题,您需要在 select list 和 group by 子句中指定所需的列

$search_alls=DB::table('a16s as A')
                ->select('A.id','A.name')
                ->addSelect(DB::raw('SUM(CASE WHEN B.approve = 1 ELSE 0 END) as Yshow'))
                ->leftjoin('a16s_likes as B', function($join) {
                    $join->on('A.id', '=', 'B.p_id');
                })
                ->groupBy('A.id')
                ->groupBy('A.name');
    ->get();

根据较新的版本,mysql 5.7 不允许选择列表、HAVING 条件或 ORDER BY 列表引用未在 GROUP BY 子句中命名的非聚合列的查询

12.19.3 MySQL Handling of GROUP BY


根据文档

MySQL 5.7.5 及更高版本实现了功能依赖检测。如果启用ONLY_FULL_GROUP_BY SQL 模式(默认情况下),MySQL 将拒绝选择列表、HAVING 条件或 ORDER BY 列表引用非聚合列的查询,这些列既不在 GROUP BY 子句中命名,也不在功能上依赖在他们。 (5.7.5之前,MySQL不检测函数依赖,默认不启用ONLY_FULL_GROUP_BY

【讨论】:

  • 这是真的。我不能使用 * 并且必须对所有列进行 grouBy(...) 。有效~非常感谢!但是没有任何使用*的解决方案,因为它很方便?
  • @robspin 要使用*,您需要在单独的子句中执行 a16s_likes 的聚合,然后将此子句与您的表连接
【解决方案2】:

使用 select('A.*') 选择所有列

 $search_alls=
    DB::table('a16s as A') 
    ->select('A.*')
    ->addSelect(DB::raw('SUM(CASE WHEN B.approve = 1 ELSE 0 END) as Yshow'))
    ->leftjoin('a16s_likes as B', function($join) {
        $join->on('A.id', '=', 'B.p_id');
        })
    ->groupBy('A.id')
    ->get();

【讨论】:

  • 这如何修复 OP?
  • 解决了我的问题
【解决方案3】:

我详细了解了您的问题。 我也面临同样的问题。 在database.php中,有以下设置

'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            '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,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

当我将严格属性设置为 false 时,它​​正在工作,并且我已经解决了问题。

【讨论】:

    【解决方案4】:

    你必须在 Laravel 应用程序中关闭严格模式。

    转到config/database.php

    MySQL集合下

    strict => false
    

    它将开始工作。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-11-12
      • 2015-10-13
      • 2022-01-20
      • 2014-05-13
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      相关资源
      最近更新 更多