Удаление повторяющихся записей из базы данных Laravel - PullRequest
0 голосов
/ 21 июня 2019

Я прочитал несколько «решений» о переполнении стека, но ни одно из них точно не ответило на вопрос.

Как удалить дубликаты данных, основанные на нескольких полях из базы данных, но сохранив одну запись.

Например, я сохранил в своей базе данных:

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

и идентификатор конечного результата:: 1008 *

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

Я не слишком уверен, как это сделать, потому что мне нужно проверить наличие дубликатов с одинаковыми именами и полями, а затем удалить все, кроме 1.

Любая помощь приветствуется.

Ответы [ 2 ]

4 голосов
/ 21 июня 2019

Один из подходов для этого. Например, используя 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 голос
/ 21 июня 2019

Вы можете выполнить следующий запрос из 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)
...