laravel查询生成器上的左联接不存在A. *

时间:2018-06-20 05:48:56

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

   $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凝块时 我得到了错误

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

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

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

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

4 个答案:

答案 0 :(得分:1)

要解决此问题,您需要在选择列表中指定必填列并按子句分组

$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模式(默认情况下为SQL模式),MySQL将拒绝查询,其中选择列表,HAVING条件或ORDER BY列表引用的是未在GROUP BY子句中命名的未聚合列功能上取决于他们。 (在5.7.5之前,MySQL不会检测到功能依赖性,并且默认情况下未启用ONLY_FULL_GROUP_BY

答案 1 :(得分:0)

使用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();

答案 2 :(得分:0)

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

转到config/database.php

在MySQL设置下

strict => false

它将开始工作。

希望这会有所帮助。

答案 3 :(得分:0)

我详细看到了您的问题。 我也遇到过同样的问题 在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'),
            ]) : [],
        ],

当我将strict属性设置为false时,它正在起作用,并且我已经解决了问题。