2015-11-08 4 views
7

Ich habe zwei Modelle: posts und likings, die One-to-many Beziehung (so, ein Beitrag hat viele Likes). Likings Modell hat auch ein isActive Feld, das zeigt, dass Liking aktiv oder passiv ist.Wie zu lösen "ist nicht in GROUP BY" Fehler in MySQL Abfrage

Ich möchte Top 5 Beiträge erhalten, die maximal "aktive" Likes erhalten haben (nur Likes, deren isActive Feld wahr ist, würden berücksichtigt werden).

Dies ist die Abfrage:

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 

, die aus dieser Laravel Abfrage ergab sich:

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(); 

Und das ist der Fehler: Hier

SQLSTATE[42000]: Syntax error or access violation: 1055 
'database.posts.user_id' isn't in GROUP BY 

, posts.user_id ist auch ein Feld posts Tabelle und zeigt den Besitzer der Post.

Wie kann ich diesen Fehler beheben? Es scheint, dass es nicht logisch ist, mysql config zu ändern (wahrscheinlich ONLY_FULL_GROUP_BY Modus zu löschen), aber minimale Änderung in der Abfrage.

+0

Standardmäßig müssen Sie jedes ausgewählte Feld in der Gruppenklausel auflisten oder eine der Aggregatfunktionen verwenden. –

Antwort

7

Jedes nicht aggregierte Feld sollte gruppiert werden.

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 

Oder können Sie es 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 

andere Art und Weise - sql_mode ändern:

SET SESSION sql_mode = ''; 

Auch Sie es auf 2 Abfrage aufteilen kann:

  1. Get aggregate und post-IDs
  2. Beiträge werden Daten mit abgerufenen IDs (mit IN clause)
+0

Ich brauche alle Felder der Beiträge. Kann ich nicht die Abfrage mit Posts starten. * – horse

+0

Sie können, aber Sie können es nicht in der Gruppenklausel tun. Andere Möglichkeit ist 'sql_mode' in' mysql' Config oder in der Session zu ändern –

+0

Vielleicht sollte ich eine Abfrage mehr schreiben. – horse

1

In 5.7 die sqlmode standardmäßig eingestellt ist:

ONLY_FULL_GROUP_BY,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

die Klausel entfernen ONLY_FULL_GROUP_BY Sie das tun können:

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

kann es irgendwelche Probleme verursachen, wenn wir das getan haben? – BhargavSushant