我有两个模型:posts
和likings
一对多关系(因此,一个帖子有很多喜欢)。喜好模型还具有一个isActive
显示喜好是主动还是被动的字段。
我想获得(排序)收到最多“活跃”赞的前5个帖子(仅考虑其isActive字段为true的赞)。
这是查询:
select posts.*, count(likings.id) as likes_count from 'posts'
left join 'likings' on 'likings'.'post_id' = 'posts'.'id' and 'likings'.'isActive' = 1
group by 'posts'.'id'
order by 'likes_count' desc
limit 5
这是由于这个laravel查询导致的:
Post::selectRaw('posts.*, count(likes.id) as likes_count')
->leftJoin('likes', function ($join) {
$join->on('likes.post_id', '=', 'posts.id')
->where('likes.is_active', '=', 1);
})
->groupBy('posts.id')
->orderBy('likes_count', 'desc')
->take(5)
->get();
这是错误:
SQLSTATE[42000]: Syntax error or access violation: 1055
'database.posts.user_id' isn't in GROUP BY
在这里,posts.user_id
也是posts
表格字段,显示帖子的所有者。
如何解决此错误?更改mysql配置(可能是删除ONLY_FULL_GROUP_BY
模式)似乎不合逻辑,但查询中的更改最少。
每个未汇总的字段均应分组。
这是标准行为,在mysql中取决于ONLY_FULL_GROUP_BY模式。
默认情况下,此模式在> =中启用5.7
。
select posts.id, post.user_id, count(likings.id) as likes_count
from posts
left join likings on likings.post_id = posts.id and likings.isActive= 1
group by posts.id, posts.user_id
order by likes_count desc
limit 5
或者,您可以aggregate
:
select posts.id, MIN(post.user_id), count(likings.id) as likes_count
from posts
left join likings on likings.post_id = posts.id and likings.isActive= 1
group by posts.id
order by likes_count desc
limit 5
其他方式-更改sql_mode
:
SET SESSION sql_mode = '';
另外,您可以将其分为2个查询:
IN clause
)的帖子数据本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句