Как можно это ускорить? Суть, есть база грязная, в ней

туча дублей, дубли разные могут содержать дополнительные полезные поля.
Нужно найти эти дубли, выбрать из них самый полезный, остальные удалить. Сделал команду


public function handle()
{
$this->info('Проверяем дубликаты в ...');


// Поиск дубликатов с учетом регистра
$duplicates = DB::table('point')
->select(DB::raw('BINARY(name) as name'), 'addres', DB::raw('COUNT(*) as count'))
->groupBy(DB::raw('BINARY(name)'), 'addres')
->havingRaw('COUNT(*) > 1')
->get();

$progressBar = new ProgressBar($this->output, count($duplicates));
$progressBar->setFormat('%current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% Осталось времени: %remaining:6s% Использование памяти: %memory:6s%');
$progressBar->start();

$deletedCount = 0;

foreach ($duplicates as $duplicate) {
// Получение всех записей-дубликатов
$records = DB::table('point')
->where(DB::raw('BINARY(name)'), $duplicate->name)
->where('addres', $duplicate->addres)
->get();

$minFields = PHP_INT_MAX;
$recordToDelete = null;

foreach ($records as $record) {
// Подсчет количества заполненных полей
$filledFields = count(array_filter((array)$record, function ($value) {
return !is_null($value) && $value !== '';
}));

// Выбор записи с наименьшим количеством заполненных полей
if ($filledFields < $minFields) {
$minFields = $filledFields;
$recordToDelete = $record;
}
}

if ($recordToDelete) {
// Удаление записи без подтверждения
DB::table('point')
->where('id', $recordToDelete->id)
->delete();
$deletedCount++;
}

$progressBar->advance();
}

$progressBar->finish();
$this->line('');
$this->info("Удалено $deletedCount дубликатов.");
}

2 ответов

4 просмотра

Обрами в код, а то паршиво ясно)) На первый взгляд можно запросить все дубликаты сразу сгруппировав уже коллекцию. А запрашивать используя группировку с хэвинг как подзапрос. select * from point where id in (select id from point group by binary(name),addres having count(*) > 1)

Денис-Александрович Автор вопроса
Vladimir 
Обрами в код, а то паршиво ясно)) На первый взгля...

Мне нужно проверить каждый дубль отдельно, так как внутри может быть несколько записей одинаковых

Похожие вопросы

Обсуждают сегодня

Доброе утро, правильно ли я понимаю что можно украсить list columns у tailor type: stream через кастомный registerListColumnType? или как правильно ?
Max Dubovsky
2
Привет Хочу сделать аналог iCloud’а для своих проектов, чтобы пользовательская информация хранилась в облаке, была доступна во всех сервисах, её можно было подсасывать везде)...
Виталий
9
Кто хочет поиграться в легкий взлом специально уязвимого приложения? :) Ваше задани - вы студент группы 416 - оценку в 100 баллов и найти 10 флагов (текстовых) формата Step0...
Andrii Kurdiumov
4
код Event::listen('cms.page.display', function (&$content, $slug, $page, $html) { if (is_object($content)) { dump($content); } else { dump($s...
Point 111
3
<div class="report-widget"> <h3 style="margin-bottom:10px;"> <?= e(__($this->property('title'))) ?> </h3> <button type="submit" data-request-flash ...
Vladimir 
2
Точно проблема в твиге?
Vladimir 
5
Ребят, а почему вызов add-tag может возвращать не нулевой код даже если операция прошла успешно? Дело в том, что образ корректно помечается, но ветка заходит в "then"... gclou...
Philipp Bondarev
2
Всем привет. Не понимаю, в чём тут шутка юмора. Убирается только разрешение на send_messages. А send_media_messages остаётся. Как сделать, чтобы оба убирались? await b...
Alexander
2
<div class="report-widget"> <h3 style="margin-bottom:10px;"> <?= e(__($this->property('title'))) ?> </h3> <button type="submit" data-control="popup...
Point 111
1
@LeMaX10 а ты же делаешь в своем боте капчу на вход в чат? или так же на первое сообщение?
Sergey
4
Карта сайта