a.*不在group by中,在laravel query builder上使用left join

sdnqo3pr  于 2021-06-20  发布在  Mysql
关注(0)|答案(4)|浏览(340)
$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();

当我使用以上选择('a.id')是工作得很好。
但是当我使用select('a.*)来选择一个cloumn时,我得到了一个错误

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

ps:employee是我的数据库名表上的列是

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

如何通过leftjoin选择所有列?列a.id是与b.p\u id列的一对多关系。

jtoj6r0c

jtoj6r0c1#

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

dzjeubhm2#

我详细地看了你的问题。我也面临同样的问题。在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时,它起作用了,我解决了这个问题。

sh7euo9m

sh7euo9m3#

您必须在laravel应用程序中关闭sctrict模式。
config/database.php 在mysql集合下

strict => false

它就会开始工作。
希望这有帮助。

eaf3rand

eaf3rand4#

要解决此问题,需要在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,不允许select list、having condition或order by list引用groupby子句中未命名的非聚集列的查询
12.19.3 mysql分组处理
根据文件
mysql 5.7.5及更高版本实现了函数依赖性的检测。如果启用了only\ full\ group\ by sql模式(默认情况下是这样),mysql将拒绝select list、having condition或order by list引用的未聚合列,这些列既不在groupby子句中命名,也不在功能上依赖于它们(在5.7.5之前,mysql没有检测到函数依赖性,默认情况下只启用\u full \u group \u by

相关问题