Php 使用Laravel的查询生成器返回完全重复的行

Php 使用Laravel的查询生成器返回完全重复的行,php,mysql,laravel,inner-join,query-builder,Php,Mysql,Laravel,Inner Join,Query Builder,我希望返回表中重复记录的完整信息 我目前正在使用以下工具: DB::table($entity['table']) ->select('*') ->groupBy($entity['columns']) ->havingRaw('COUNT(*) > 1') ->get(); 这很好,它会返回重复的记录,但是,这只会返回一条记录,我需要返

我希望返回表中重复记录的完整信息

我目前正在使用以下工具:

DB::table($entity['table'])
                ->select('*')
                ->groupBy($entity['columns'])
                ->havingRaw('COUNT(*) > 1')
                ->get();
这很好,它会返回重复的记录,但是,这只会返回一条记录,我需要返回所有重复的记录,这样我就可以向用户打招呼,选择删除或保留哪一条记录


我如何修改上述查询以实现这一点

您需要在$entity['columns']中的列上连接回$entity['table']中的表,以获取重复项

此外,即使您使用的是mysql,选择“*”也不是一个好主意。这与sql标准背道而驰,只有在以某种方式进行配置的情况下才能在mysql中工作。如果配置发生更改,或者您将应用程序迁移到sql模式下具有不同配置的mysql服务器,您的查询将失败

我也会在选择列表中使用$entity['columns']

在sql中,查询应如下所示:

select table.* from table inner join
  (select field1, field2 from table t
  group by field1, field2
  having count(*)>1) t1
on table.field1=t1.field1 and table.field2=t1.field2

根据同一个表进行连接将允许您检索重复的记录,而不必只获取由您的问题中的groupBy引起的记录的单一版本

$entity['columns'] = ['username', 'surname'];

$groupBy = implode(',', $entity['columns']);

$subQuery = DB::table('list')
    ->select('*')
    ->groupBy($groupBy)
    ->havingRaw('(count(id) > 1))');

$result = DB::table('list')
    ->select('*')
    ->join(
        DB::raw("({$subQuery->toSql()}) dup"), function($join) use ($entity) {
            foreach ($entity['columns'] as $column) {
                $join->on('list.'.$column, '=', 'dup.'.$column);
            }
        })
    ->toSql();
    // or ->get(); obviously

    dd($result);

您可以通过使用where和函数来查询正在使用的同一个表来实现这一点

假设您有一个场景,希望在用户表中查找包含相同姓氏的重复记录

数据库表-用户

将返回以下内容

--- user_id --- last_name 3 Grant 6 Grant 7 Grant
$['columns']的内容是什么?这是一个字符串还是一个数组?它目前是一个数组,但只有一个元素,只是想让它按我目前需要的方式工作:感谢您的帮助,这将起作用,我可以看到这里发生了什么,但我的问题是更多我如何在Laravel查询生成器中做到这一点?有什么想法吗?关于如何在Laravel中构建子查询,有很多主题,例如:这似乎会从查询中返回多个重复项您有样本数据集吗?当然,结帐这个问题,因为我最后单独发布了它:生成错误1248-每个派生表都必须有自己的别名从$subQuery中删除额外的括号来解决您的问题
 $duplicates = DB::table('user')
 ->select('user_id', 'last_name')
 ->whereIn('user_id', function ($q){
             $q->select('user_id')
             ->from('user')
             ->groupBy('last_name')
             ->havingRaw('COUNT(*) > 1');
 })->get();
--- user_id --- last_name 3 Grant 6 Grant 7 Grant