2017-07-06 9 views
0

私はプレイヤーに対してポイントを含むデータベーステーブルを持っています。シングルプレイヤーはテーブルに複数のレコードを持っています。私はplayer_idでレコードをグループ化する必要があります。そして、私は各グループの最初の3つのレコードの平均を取得しようとしています。私は昨晩、これに到達しようとしました。しかし、私はこれを解決する運がなかった。Laravel各グループから最初の3つのレコードのAVG値を取得する方法

これは私の最初のコードである、と私は、各グループの最初の3つのレコードのAVGは(player_idによってグループ化)を取得するために、これを変更する必要が

$oSelect = DB::table('statistics') 
      ->where('statistics.league_id', $league_id) 
      ->select('id, AVG('statistics.points as points'),player_id, scheduled') 
      ->orderBy('statistics.scheduled','DESC') 
      ->groupBy('statistics.player_id'); 

は、高度な

答えて

0

でいただきありがとうございますが、これを試してみてください。

$oSelect = DB::table('statistics') 
     ->select(DB::raw('id, AVG(statistics.points) as points,player_id,scheduled')) 
     ->where('statistics.league_id', $league_id) 
     ->orderBy('statistics.scheduled','DESC') 
     ->groupBy('statistics.player_id')->limit(3)->get(); 

注意:非凝集列エラーを取得する場合、その場合は、あなたが列リストによってグループ化または無効番目にid列を追加する必要がありますMySQLの

Disable ONLY_FULL_GROUP_BY

+0

ルックスでオプションONLY_FULL_GROUP_BY eは、あなたは私の質問を誤解しています。私が望むのは、データセット全体を制限するのではなく、各グループを制限することです。 (各プレイヤーの最初の3レコードを取得してAVGを取得します) –

+0

申し訳ありませんが、サンプルコードが間違っていて、必要に応じて単純すぎます。しかし、私はこの複雑な問題を解決するためにLaravel DBのファサードを使用してコードを混乱させるかもしれないと言うことができ論理的ではありません。ストアドプロシージャを使用し、コード側から関数を呼び出すことをお勧めします。各グループのレコードを制限する方法を知りたい場合は、このページをチェックアウトしてください: –

+0

https://stackoverflow.com/questions/12113699/get-top-n-records-for-each-group-of-grouped-results –

関連する問題