Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 由于select DB:raw和GROUP BY未聚合列,导致Laravel语法错误_Php_Laravel_Group By_Laravel Query Builder_Mysql Error 1055 - Fatal编程技术网

Php 由于select DB:raw和GROUP BY未聚合列,导致Laravel语法错误

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

我有以下4个SQL表:

工作室 整数id 字符串名 整数last\u movie\u id

电影 整数id 整数演播室id 字符串类型

电影演员 整数电影识别码 整数参与者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]:语法错误或访问冲突: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,这真的很难看吗?非常感谢。向电影表添加第二个连接是正确的做法!太好了,谢谢!