2017-06-06 17 views
0

に複数のレコードで注文しようとしたときに、非集約列が含まれていますはじめGROUP BY句との関係

だからアイデアは、我々は、このテーブルを知るために必要なすべては、それが持っているということです、私はplayersテーブルを持っているということですidおよびusernameフィールド。

私はfinancialsテーブルも持っています。このテーブルについて知る必要があるのは、player_id外部キーを通してplayersテーブルを参照することだけです。また、別の2つのフィールド、stakedwonがあります。

playerは、多くの場合、financialsです。たとえば、プレーヤーは5 financialsのレコードを自分自身に関連付けることができます。

問題

私は彼らの財務記録でソートされている選手のリストを返すようにしようとしています。たとえば、私は会社の純収入を最も多く得たプレイヤーを検索したいと思います。以下は、Laravelの クエリビルダ(Illuminate\Support\Facades\DB)に対して書いたクエリです。

DB::table('financials AS f') 
     ->select(['*', DB::raw('SUM(staked - (won)) AS net_revenue')]) 
     ->join('players AS p', function ($join) use ($param) { 
      $join->on('f.player_id', '=', 'p.id') 
       ->where('p.id', 'like', '%' . $param . '%') 
       ->orWhere('p.username', 'like', '%' . $param . '%'); 
      }) 
     ->orderBy('net_revenue') 
     ->groupBy(['f.id']) 
     ->paginate($perPage); 

エラー

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #9 of 
SELECT list is not in GROUP BY clause and contains nonaggregated column 
'master.p.id' which is not functionally dependent on columns in GROUP BY 
clause; this is incompatible with sql_mode=only_full_group_by (SQL: select 
*, SUM(staked - (won)) AS net_revenue from `financials` as `f` inner join 
`players` as `p` on `f`.`player_id` = `p`.`id` and `p`.`id` like %% or 
`p`.`username` like %% group by `f`.`id` order by `net_revenue` asc limit 15 
offset 0) 

誰かがこの問題を修正するには正しい方向に私を指すしてくださいもらえますか?私は大いに感謝しています。

EDIT(2017年8月6日):

 $query = DB::table('financials AS f1') 
     ->select(['f1.id', 'f1.plays', 'f1.game_id', 'f1.staked', 'f1.won', 'f1.player_id', 'f1.date', 'f1.type', DB::raw('SUM(f1.staked - (f1.won)) AS net_revenue')]) 
     ->leftJoin('financials AS f2', 'f1.player_id', '=', 'f2.player_id') 
     ->groupBy(['f1.id', 'f1.player_id', 'f1.game_id']) 
     ->orderBy($orderBy) 
     ->paginate($perPage); 

だから私のクエリは次のようになり、それが動作しますが、それは各レコードのnet_revenueを生成します。しかし、同じplayer_idに対して複数のレコードを返します。

同じプレイヤーのレコードが2つある場合、両方のレコードのnet_revenueが計算され、最高から最低の順に並べられますが、すべてのnet_revenueの計算を含むプレーヤーのレコードは1つだけです。

答えて

0

フィールド名の代わりにSUM(staked - (won))として注文を変更します。

+0

これは未知の列 'SUM(staked - (won)) ' –

+0

実際には、今のところグループと同じエラーです。 –

+0

私はあなたが*間違っていることを選択していると思います。あなたは列と集約式だけを選択しなければなりません。select by order by節の問題です。 – SAJ