我已经阅读了一些有关堆栈溢出的“解决方案”,但没有一个确实可以回答这个问题。
如何根据数据库中的几个字段删除重复的数据,但保留一个条目。
例如,我已经存储在数据库中:
--files
和最终结果ID想要的是:
[
['id' => 1, 'name' => 'Spend', 'amount' => 10.55],
['id' => 2, 'name' => 'Spend', 'amount' => 10.52],
['id' => 3, 'name' => 'Spend', 'amount' => 10.55],
]
我不太确定该怎么做,因为我需要检查具有相同名称和金额字段的重复项,然后删除除1以外的所有重复项。
感谢您的帮助。
答案 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)