$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列是一对多的关系。
答案 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时,它正在起作用,并且我已经解决了问题。