2015-11-08 90 views
7

我有兩種模式:postslikings它們有一對多的關係(所以,一個職位有很多喜歡)。 Likings模型還有一個isActive字段,顯示喜歡是主動還是被動。如何解決「不在GROUP BY」錯誤在mysql查詢

我想得到(排序)前5個已收到最多「活躍」喜歡的帖子(只有喜歡其isActive字段是真的會被考慮)。

這是查詢:

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 config(可能刪除ONLY_FULL_GROUP_BY模式)是不合邏輯的,但是查詢中的最小改變。

+0

按照標準,您必須列出'group clause'中的每個選定字段或使用聚合函數之一。 –

回答

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查詢:

  1. 獲取聚合和帖子ID
  2. 獲取與獲取的IDS數據發佈(與IN clause
+0

我需要帖子的所有字段。我不能用帖子開始查詢。* – horse

+0

你可以,但是你不能在group子句中這樣做。其他選項是在'mysql' config或會話中更改'sql_mode' –

+0

也許我應該多寫一個查詢。 – horse

1

在5.7是SQLMode被默認設置爲:

ONLY_FULL_GROUP_BY,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

要取消該ONLY_FULL_GROUP_BY你可以這樣做:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); 
+0

如果我們這樣做會導致任何問題嗎? – BhargavSushant