php - 当尝试按关系中的多个记录进行排序时,GROUP BY 子句并包含非聚合列

标签 php mysql sql laravel pdo

简介

所以我的想法是,我有一个 players 表,我们需要了解这个表的是它有一个 idusername > 字段。

我还有一个 financials 表,我们需要了解这个表的是它通过 player_id 外部引用 players 表 key 。它还有另外两个字段,stakewon

一个玩家可以拥有许多财务。例如,一名玩家可能有 5 条与自己相关的财务记录。

问题

我正在尝试返回按财务记录排序的玩家列表。例如,我想检索为公司带来最多净收入的玩家。这是我针对 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(staked - (won)) 而不是字段名称。

关于php - 当尝试按关系中的多个记录进行排序时,GROUP BY 子句并包含非聚合列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44394403/

相关文章:

php - 一个父行,另一个表中的多个子行。如何将它们全部排成一排?

java - 如何在ubuntu中连接mysql和eclipseoxy

sql - join语句的操作顺序

mysql - 如何在存储过程中使用插入语句生成的值?

mysql - 需要为表中存在的每一行获取 true/false

php - 无法在 php 中获取单选值

php - 如何将 PHPUnit 与 VSCode 结合使用?

mysql - 将字符串 "September 23"转换为 DATETIME

php - 为每个唯一 id 获取 mysql 表的多列,并使用 PHP 为每个唯一 id 在 HTML 表的单行中回显结果

php - 为什么mysql在false时返回true