我有一个包含3列id, sub_id, name
的表。那是一个很大的表,并且有一些重复项。
检测重复项以便删除它们的最佳方法是什么?
我尝试了此方法,但它返回了所有内容(我想以为id使它们变得不唯一)
$collection = \App\MyModel::all();
$colUnique = $collection->unique(['name', 'sub_id']);
$dupes = $collection->diff($colUnique);
我想获得具有name
和sub_id
相同的模型。
id sub_id name
1 2 John
2 2 John <- duplicate
3 2 Robin <- unique
答案 0 :(得分:3)
您可以使用Collection.groupBy
方法。
$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();
});
})
答案 1 :(得分:2)
我最好的选择是DB :: Query。
步骤1:按组提取数据
$uniqueData = DB::table('TABLE_NAME')
->groupBy(['sub_id', 'name'])
->select('id')
->toArray();
第2步:删除重复的记录。
$noOfDeletedRecords = DB::table('TABLE_NAME')
->whereNotIn($uniqueData)
->delete();
好处: 1.仅2个查询 2.优于收款。