Laravel : group by with select 两列如何有不同的值
Laravel : How group by with select two column have deferent values
我想按 table 按名称和 select 名称和日期分组,因为具有相同值的名称具有不同的日期值,我试过了但没有用:
public function period(Request $req)
{
$absences = Absence::whereBetween('date', [$req->from, $req->to])->get();
$daily = $absences->select('name ','date', 'COUNT(date) as counts');
$arr['absences'] = $absences;
$arr['daily'] = $daily;
$arr['from'] = $req->from;
$arr['to'] = $req->to;
return $arr;
return view('period',$arr,);
}
我收到错误:Method Illuminate\Database\Eloquent\Collection::select does not exist.
当我使用它时:
public function period(Request $req)
{
$absences = Absence::selectraw('name , date')->whereBetween('date', [$req->from, $req->to])->groupBy('name')->get();
$arr['absences'] = $absences;
$arr['from'] = $req->from;
$arr['to'] = $req->to;
//return $arr;
return view('period',$arr,);
}
我明白了:
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'absences.absences.date' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (SQL: select name , date from absences
where date
between 2021-10-02 and 2021-10-12 group by name
)
你能试试这个吗?我认为问题是您忘记按所选(非聚合)列分组。
$daily = Absence::query()
->select('name', 'date')
->selectRaw('count(date) as counts')
->whereBetween('date', [$req->from, $req->to])
->groupBy('name', 'date')
->get();
dd($daily);
select子句中的所有列也应该在group by中,这是mysql中的严格模式。
如果要更改它,请转到 config/database.php 并将其设置为 false:
'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' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => false, // instead of true
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
我想按 table 按名称和 select 名称和日期分组,因为具有相同值的名称具有不同的日期值,我试过了但没有用:
public function period(Request $req)
{
$absences = Absence::whereBetween('date', [$req->from, $req->to])->get();
$daily = $absences->select('name ','date', 'COUNT(date) as counts');
$arr['absences'] = $absences;
$arr['daily'] = $daily;
$arr['from'] = $req->from;
$arr['to'] = $req->to;
return $arr;
return view('period',$arr,);
}
我收到错误:Method Illuminate\Database\Eloquent\Collection::select does not exist.
当我使用它时:
public function period(Request $req)
{
$absences = Absence::selectraw('name , date')->whereBetween('date', [$req->from, $req->to])->groupBy('name')->get();
$arr['absences'] = $absences;
$arr['from'] = $req->from;
$arr['to'] = $req->to;
//return $arr;
return view('period',$arr,);
}
我明白了:
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'absences.absences.date' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (SQL: select name , date from
absences
wheredate
between 2021-10-02 and 2021-10-12 group byname
)
你能试试这个吗?我认为问题是您忘记按所选(非聚合)列分组。
$daily = Absence::query()
->select('name', 'date')
->selectRaw('count(date) as counts')
->whereBetween('date', [$req->from, $req->to])
->groupBy('name', 'date')
->get();
dd($daily);
select子句中的所有列也应该在group by中,这是mysql中的严格模式。 如果要更改它,请转到 config/database.php 并将其设置为 false:
'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' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => false, // instead of true
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],