Php 由于select DB:raw和GROUP BY未聚合列,导致Laravel语法错误
我有以下4个SQL表: 工作室 整数id 字符串名 整数last\u movie\u id 电影 整数id 整数演播室id 字符串类型 电影演员 整数电影识别码 整数参与者id 演员 整数id 字符串名 我试图构建一个查询,为我提供一个特定演员的列表,他工作过的工作室的列表,包括工作室的最后一部电影,演员是否在其中扮演: 演播室名称 本工作室最后一部电影的日期 此工作室最后一部电影的类型 我的代码在ActorController中如下所示:Php 由于select DB:raw和GROUP BY未聚合列,导致Laravel语法错误,php,laravel,group-by,laravel-query-builder,mysql-error-1055,Php,Laravel,Group By,Laravel Query Builder,Mysql Error 1055,我有以下4个SQL表: 工作室 整数id 字符串名 整数last\u movie\u id 电影 整数id 整数演播室id 字符串类型 电影演员 整数电影识别码 整数参与者id 演员 整数id 字符串名 我试图构建一个查询,为我提供一个特定演员的列表,他工作过的工作室的列表,包括工作室的最后一部电影,演员是否在其中扮演: 演播室名称 本工作室最后一部电影的日期 此工作室最后一部电影的类型 我的代码在ActorController中如下所示: $actor = \App\Actor::findOr
$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]:语法错误或访问冲突:SELECT list的1055表达式3不在GROUP BY子句中,并且包含未聚合列[…]这与sql\u mode=only\u full\u GROUP\u BY不兼容
为了避免这个错误,我不想将sql\u strict\u模式设置为false。我想知道我的问题出在哪里。我尝试过像任何值一样使用聚合函数,但没有任何效果。您错误地编写了查询-特别是 \DB::raw'SELECT movies.type FROM movies WHERE movies.id=studios.last_movie_id'作为SELECT语句中的类型。此查询为您提供的值不是COLUNM NAME,它应该位于select语句中,如select col1Name、col2Name等。。。。来自 由于您没有提供完整的表结构和关系i.e-您在查询中提到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();
至于其他问题,我想你知道了
我该怎么做-
为以下查询创建迁移-
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;
然后运行migrate命令,然后为view actors\u studio创建一个模型,即VwActorStudios,然后创建一个简单的查询
$studios = VwActorStudios::where('actor_id', $actor->id)->get();
可能重复的movies.type和附加的连接条件不起作用,而不需要在select中嵌套select,这真的很难看吗?非常感谢。向电影表添加第二个连接是正确的做法!太好了,谢谢!