从数据库Laravel中删除重复的条目

时间:2019-06-21 11:41:32

标签: mysql laravel eloquent duplicates

我已经阅读了一些有关堆栈溢出的“解决方案”,但没有一个确实可以回答这个问题。

如何根据数据库中的几个字段删除重复的数据,但保留一个条目。

例如,我已经存储在数据库中:

--files

和最终结果ID想要的是:

[
    ['id' => 1, 'name' => 'Spend', 'amount' => 10.55],
    ['id' => 2, 'name' => 'Spend', 'amount' => 10.52],
    ['id' => 3, 'name' => 'Spend', 'amount' => 10.55],
]

我不太确定该怎么做,因为我需要检查具有相同名称和金额字段的重复项,然后删除除1以外的所有重复项。

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

一种执行此操作的方法,例如使用DB::delete()运行原始查询。

$affectedRow = DB::delete('DELETE t1 FROM table t1, table t2 WHERE t1.id > t2.id AND t1.name = t2.name AND t1.amount = t2.amount');

table更改为您的实际表名。

它返回删除的行数。

另一种解决方案: 未经测试!

您还可以在此处添加其他自定义查询!

// find the duplicate ids first.
$duplicateIds = DB::table("table")
                    ->selectRaw("min(id) as id")
                    ->groupBy("amount", "name")
                    ->havingRaw('count(id) > ?', [1])
                    ->pluck("id");



// Now delete and exclude those min ids.
DB::table("table")
    ->whereNotIn("id", $duplicateIds)
    ->havingRaw('count(id) > ?', [1])
    ->delete();


答案 1 :(得分:1)

您可以从Laravel或直接在数据库中运行以下查询。

我假设您具有以下结构的数据库。

CREATE TABLE `tbl_order` (
  `id` int(11) NOT NULL,
  `name` varchar(35) DEFAULT NULL,
  `amount` decimal(9,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;  

运行以下查询,这将删除那些重复的数据。

DELETE order_1 FROM tbl_order order_1, tbl_order order_2 WHERE order_1.id > order_2.id AND (order_1.name = order_2.name AND order_1.amount = order_2.amount)