Laravel 由于 select DB:raw 和 GROUP BY 的非聚合列导致的语法错误
Laravel syntax error due to nonaggregated column with select DB:raw and GROUP BY
我有以下 4 个 SQL 表:
工作室
整数 id
字符串名称
整数 last_movie_id
电影
整数 id
整数 studio_id
字符串类型
actor_movie
整数movie_id
整数 actor_id
演员
整数 id
字符串名称
我正在尝试构建一个查询,为我提供特定演员、他工作的工作室列表,包括该工作室的最后一部电影(无论该演员是否在其中演出):
- 工作室名称
- 该工作室最后一部电影的日期
- 该工作室上一部电影的类型
我的代码如下(在 ActorController 中):
$actor = \App\Actor::findOrFail($id);
$studios = \DB::table('actor_movie')
->leftjoin('movies', 'actor_movie.movie_id', '=', 'movies.id')
->leftjoin('studios', 'studios.id', '=', 'movies.studio_id')
->select(
'studios.name',
'studios.last_movie_date'
\DB::raw('(SELECT movies.type FROM movies WHERE movies.id = studios.last_movie_id') as type')
->where('actor_movie.actor_id', $actor->id)
->groupBy('studios.name', 'studios.last_movie_date', 'type')
->get();
但是我有以下错误:
SQLSTATE[42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合列 [...] 这与 [=68= 不兼容]=only_full_group_by
我不想将 sql_strict_mode 设置为 false 以规避此错误。我想了解我的查询有什么问题。我尝试使用 "ANY_VALUE" 之类的聚合函数,但没有成功。
您写错了查询 - 特别是
\DB::raw('(SELECT movies.type FROM movies WHERE movies.id = studios.last_movie_id') as type
在 select
语句中。此查询为您提供 value(s) 而不是 COLUNM NAME
,它应该在 select
语句中,例如 select col1Name, col2Name, .... from ....
.
由于您没有提供完整的 table 结构和关系(即您在查询中提到了 studios.last_movie_date 但不是问题),任何人都很难给您正确的查询,但下面应该工作正常 -
$actor = \App\Actor::findOrFail($id);
$studios = \DB::table('actor_movie')
->leftjoin('movies', 'actor_movie.movie_id', '=', 'movies.id')
->leftjoin('studios', 'studios.id', '=', 'movies.studio_id')
->leftjoin('movies as mov2', 'studios.last_movie_id', '=', 'mov2.id')
->select(
'studios.name',
'studios.last_movie_date',
'mov2.type'
)
->where('actor_movie.actor_id', $actor->id)
->groupBy('studios.name', 'studios.last_movie_date', 'type')
->get();
对于其他问题,我想你明白了。
How would I do it -
为以下查询创建迁移 -
create view actors_studio as
select am.actor_id, mov.studio_id, std.name as studio_name, std.last_mov_id, mov2.type as last_mov_type
from actor_movie as am
left join movies as mov on am.movie_id = mov.id
left join studios as std on std.id = mov.studio_id
left join movies as mov2 on std.last_movie_id = mov2.id
group by actor_id, studio_id, studio_name, last_mov_id, last_mov_type
order by actor_id, studio_id;
然后 运行 迁移命令,然后为视图创建模型 actors_studio
即 VwActorStudios
然后是一个简单的查询
$studios = VwActorStudios::where('actor_id', $actor->id)->get();
我有以下 4 个 SQL 表:
工作室
整数 id
字符串名称
整数 last_movie_id
电影
整数 id
整数 studio_id
字符串类型
actor_movie
整数movie_id
整数 actor_id
演员
整数 id
字符串名称
我正在尝试构建一个查询,为我提供特定演员、他工作的工作室列表,包括该工作室的最后一部电影(无论该演员是否在其中演出):
- 工作室名称
- 该工作室最后一部电影的日期
- 该工作室上一部电影的类型
我的代码如下(在 ActorController 中):
$actor = \App\Actor::findOrFail($id);
$studios = \DB::table('actor_movie')
->leftjoin('movies', 'actor_movie.movie_id', '=', 'movies.id')
->leftjoin('studios', 'studios.id', '=', 'movies.studio_id')
->select(
'studios.name',
'studios.last_movie_date'
\DB::raw('(SELECT movies.type FROM movies WHERE movies.id = studios.last_movie_id') as type')
->where('actor_movie.actor_id', $actor->id)
->groupBy('studios.name', 'studios.last_movie_date', 'type')
->get();
但是我有以下错误: SQLSTATE[42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合列 [...] 这与 [=68= 不兼容]=only_full_group_by
我不想将 sql_strict_mode 设置为 false 以规避此错误。我想了解我的查询有什么问题。我尝试使用 "ANY_VALUE" 之类的聚合函数,但没有成功。
您写错了查询 - 特别是
\DB::raw('(SELECT movies.type FROM movies WHERE movies.id = studios.last_movie_id') as type
在 select
语句中。此查询为您提供 value(s) 而不是 COLUNM NAME
,它应该在 select
语句中,例如 select col1Name, col2Name, .... from ....
.
由于您没有提供完整的 table 结构和关系(即您在查询中提到了 studios.last_movie_date 但不是问题),任何人都很难给您正确的查询,但下面应该工作正常 -
$actor = \App\Actor::findOrFail($id);
$studios = \DB::table('actor_movie')
->leftjoin('movies', 'actor_movie.movie_id', '=', 'movies.id')
->leftjoin('studios', 'studios.id', '=', 'movies.studio_id')
->leftjoin('movies as mov2', 'studios.last_movie_id', '=', 'mov2.id')
->select(
'studios.name',
'studios.last_movie_date',
'mov2.type'
)
->where('actor_movie.actor_id', $actor->id)
->groupBy('studios.name', 'studios.last_movie_date', 'type')
->get();
对于其他问题,我想你明白了。
How would I do it -
为以下查询创建迁移 -
create view actors_studio as
select am.actor_id, mov.studio_id, std.name as studio_name, std.last_mov_id, mov2.type as last_mov_type
from actor_movie as am
left join movies as mov on am.movie_id = mov.id
left join studios as std on std.id = mov.studio_id
left join movies as mov2 on std.last_movie_id = mov2.id
group by actor_id, studio_id, studio_name, last_mov_id, last_mov_type
order by actor_id, studio_id;
然后 运行 迁移命令,然后为视图创建模型 actors_studio
即 VwActorStudios
然后是一个简单的查询
$studios = VwActorStudios::where('actor_id', $actor->id)->get();