GROUP BY子句中包含非聚合列

问题描述:

介绍GROUP BY子句中包含非聚合列

这样的想法是,我有一个players表,我们需要知道这个表是,它有一个idusername字段。

我还有一个financials表,我们需要知道的关于这个表的一点是,它通过player_id外键引用players表。它还有另外两个字段,stakedwon

A 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) 

可能有人请点我在正确的方向来解决这个问题?我将不胜感激。

编辑(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的多个记录。要详细说明一下,如果我有两个记录为同一个玩家,它会计算两个记录的net_revenue并将它们从高到低排序,但是我想要的只是包含所有net_revenue的计算的玩家的单个记录。

将订单更改为SUM(放样 - (韩元))而不是字段名称。

+0

这是说未知列SUM(放样 - (韩元)) –

+0

实际上,现在它与组的错误是一样的。 –

+0

我认为你选择*哪个是错误的,你应该只选择按列和聚合表达式。这是select column的问题,而不是order by子句。 – SAJ