Php Laravel Join返回重复的数据

Php Laravel Join返回重复的数据,php,mysql,laravel,laravel-5,eloquent,Php,Mysql,Laravel,Laravel 5,Eloquent,我正在尝试获取前五名玩家,我使用join获取每个玩家基于personId的信息,但我的查询返回重复的数据。我不明白为什么它会复制记录,任何帮助都是非常感谢的。谢谢 DB::table('person_competition_statistics as pcs') ->where('pcs.competitionId', $competitionId) ->where('pcs.teamId', $team

我正在尝试获取前五名玩家,我使用join获取每个玩家基于personId的信息,但我的查询返回重复的数据。我不明白为什么它会复制记录,任何帮助都是非常感谢的。谢谢

DB::table('person_competition_statistics as pcs')
                    ->where('pcs.competitionId', $competitionId)
                    ->where('pcs.teamId', $teamId)
                    ->orderBy('pcs.sStealsAverage', 'desc')
                    ->rightJoin('players as player', 'pcs.personId', '=',  'player.personId')
                    ->select(['pcs.personId', 'pcs.sStealsAverage', 'player.firstName', 'player.familyName', 'player.playingPosition', 'player.image_thumb'])
                    ->take(5)
                    ->get();
结果如下

#items: array:5 [▼
      0 => {#444 ▼
        +"personId": 29872
        +"sStealsAverage": 1.24
        +"firstName": "Rhys"
        +"familyName": ""
        +"playingPosition": ""
        +"image_thumb": ""
      }
      1 => {#438 ▼
        +"personId": 29872
        +"sStealsAverage": 1.24
        +"firstName": "Rhys"
        +"familyName": ""
        +"playingPosition": ""
        +"image_thumb": ""
      }
      2 => {#439 ▼
        +"personId": 29872
        +"sStealsAverage": 1.24
        +"firstName": "Rhys"
        +"familyName": ""
        +"playingPosition": "GRD"
        +"image_thumb": ""
      }
      3 => {#441 ▼
        +"personId": 29872
        +"sStealsAverage": 1.24
        +"firstName": "Rhys"
        +"familyName": ""
        +"playingPosition": "GRD"
        +"image_thumb": ""
      }
      4 => {#435 ▼
        +"personId": 29872
        +"sStealsAverage": 1.24
        +"firstName": "Rhys"
        +"familyName": ""
        +"playingPosition": "GRD"
        +"image_thumb": ""
      }

使用原始SQL尝试以下操作:

    $sql = " SELECT t.personId, t.sStealsAverage, 
        player.firstName, player.familyName,
        player.playingPosition, player.image_thumb
  FROM
  (
      SELECT pcs.personId, pcs.sStealsAverage
      FROM person_competition_statistics AS pcs
      WHERE pcs.competitionId = $competitionId
      AND pcs.teamId = $teamId
      ORDER BY pcs.sStealsAverage DESC
      LIMIT 5
  ) t
  LEFT players AS player ON (t.personId = player.personId)";
  $result = DB::select($sql);

我使用unique返回unique personId,并使用array\u slice获得前5名,下面是我的代码

$spg = DB::table('person_competition_statistics as pcs')
                    ->where('pcs.competitionId', $competitionId)
                    ->where('pcs.teamId', $teamId)
                    ->orderBy('pcs.sStealsAverage', 'desc')
                    ->join('players as player', 'pcs.personId', '=',  'player.personId')
                    ->select(['pcs.personId', 'pcs.sStealsAverage', 'player.firstName', 'player.familyName', 'player.playingPosition', 'player.image_thumb'])
                    ->get();

$spg = $spg->unique('personId');
$spg = array_slice($spg->values()->all(), 0, 5, true);

我认为你应该使用groupBy,使用你唯一的Id,而不使用你的表名,比如

 DB::table('person_competition_statistics as pcs')
                    ->where('pcs.competitionId', $competitionId)
                    ->where('pcs.teamId', $teamId)
                    ->orderBy('pcs.sStealsAverage', 'desc')
                    ->rightJoin('players as player', 'pcs.personId', '=',  'player.personId')
                    ->select(['pcs.personId', 'pcs.sStealsAverage', 'player.firstName', 'player.familyName', 'player.playingPosition', 'player.image_thumb'])
                    ->take(5)
                    ->groupBy('personId')
                    ->get();

添加一个
groupBy
。添加一个不同的组并删除
playingPosition
,否则您仍然会有重复的组。您可以添加组by@SougataBose我尝试添加groupBy('pcs.personId'),但返回一个错误SQLSTATE[42000]:语法错误或访问冲突:SELECT列表的1055表达式#2不在GROUP BY子句中,并且包含未聚合的列“db_nblmothership.pcs.sStealsAverage”,该列在功能上不依赖GROUP BY子句中的列;这与sql\u mode=only\u full\u组不兼容_by@NorbertvanNobelen你的解决方案有效,但我需要返回玩家PlayingPossiton仍然不起作用,它返回重复数据@NazmulHasan