首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >雄辩-检测多列重复数据

雄辩-检测多列重复数据
EN

Stack Overflow用户
提问于 2019-04-16 20:08:18
回答 2查看 4.1K关注 0票数 0

我有一个有3列id, sub_id, name的表。那是一张相当大的桌子,还有一些复制件。

什么是最好的方法来检测副本,以便我可以删除他们?

我尝试过这样做,但是它返回了所有的东西(我想it使它们变得非唯一)

代码语言:javascript
运行
复制
$collection = \App\MyModel::all();
$colUnique = $collection->unique(['name', 'sub_id']);
$dupes = $collection->diff($colUnique);

我想要有相同的namesub_id的模型。

代码语言:javascript
运行
复制
id    sub_id   name
1       2      John
2       2      John   <- duplicate
3       2      Robin  <- unique
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-16 20:35:43

您可以使用Collection.groupBy方法。

代码语言:javascript
运行
复制
$collection = \App\MyModel::all();

$collection
  // Group models by sub_id and name
  ->groupBy(function ($item) { return $item->sub_id.'_'.$item->name; })
  // Filter to remove non-duplicates
  ->filter(function ($arr) { return $arr->count()>1; })
  // Process duplicates groups
  ->each(function ($arr) {
    $arr
      // Sort by id  (so first item will be original)
      ->sortBy('id')
      // Remove first (original) item from dupes collection
      ->splice(1)
      // Remove duplicated models from DB
      ->each(function ($model) {
        $model->delete();
      });
  })
票数 3
EN

Stack Overflow用户

发布于 2019-04-16 20:36:52

我最好的选择是DB::Query。

步骤1:按组通过获取数据

代码语言:javascript
运行
复制
$uniqueData = DB::table('TABLE_NAME')
                  ->groupBy(['sub_id', 'name'])
                  ->select('id')
                  ->toArray();

步骤2:删除重复记录.

代码语言:javascript
运行
复制
$noOfDeletedRecords = DB::table('TABLE_NAME')
                          ->whereNotIn($uniqueData)
                          ->delete();

的优点: 1.只有2个查询2.比集合更好的性能。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55715895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档