@Msim

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

Задача реализовать поиск по бд и нахождение повторов , но удалять нужно не все повторы , а только те дубликаты которые лежат в 1 категории.

p2.txt:

    8557;360 г;299
    8558;Рогалик;344
    8559;Рогалик;344
    8560;Батон;344
    8561;Батон;344
    8562;Батон;340
    8563;Батон;340
    8564;Intersnack;347
    8565;Intersnack;347
    8566;Повна Чаша;347
    8567;Повна Чаша;347
    8568;Булочка;344
    8569;Булочка;344

 <code lang="php">
<?php
    
    class create
    {
        public function getContent($file)
        {
            $lines = file_get_contents($file);
    
            $data = explode(PHP_EOL, $lines);
            return $data;
        }
    
        public function connect()
        {
            $params = parse_ini_file('config.ini');
    
    
            if (!is_array($params)) {
                throw new Exception("Error #1");
            } else {
                $db = new PDO($params['db.conn'], $params['db.user'], $params['db.pass']);
    
            }
            return $db;
        }
    
        public function suit()
        {
            $db = $this->connect();
            $con = $this->getContent('p2.txt');
    
    
            for ($i = 0; count($con) > $i; $i++) {
                $correct = explode(";", $con[$i]);
    
    
                for ($a = 0; count($con) > $a; $a++) {
                    $correct2 = explode(";", $con[$a]);
    
                    if ($correct[0] !== $correct2[0] && $correct[1] == $correct2[1] && $correct[2] == $correct2[2]) {
    
    
                            $sql_update = "UPDATE ps_feature_product
                                      SET id_feature_value = :id_correct
                                      where id_feature_value = :id_fc and id_feature = :id_f";
    
                            $result = $db->prepare($sql_update);
    
                            $result->execute(
                                [
                                    ':id_fc' => $correct2[0],
                                    ':id_f' => $correct2[2],
                                    ':id_correct' => $correct[0]
                                ]
                            );
                            $sql_delete = "DELETE
                                      FROM ps_feature_value_lang
                                      WHERE ps_feature_value_lang.id_feature_value = :id_f
                                      AND ps_feature_value_lang.id_lang = 1";
    
                            $result = $db->prepare($sql_delete);
    
                            $result->execute(
                                [
                                    ':id_f' => $correct2[0],
                                ]
                            );
    
    
                    }
    
                }
    
    
            }
        }
    
    }
    
    $cr = new create;
    $cn2 = $cr->connect();
    $cr->suit();</code>

проблема: удаляет не 1 повтор, а все(т.е. и сам себя).

Это свойство прикриплено к товару, например Рогалик марки Повна Чаша например, т.е мне нужно обязателно сохранить 1 свойство убрав дубликаты и перебрать, если у дубликата товары прекреплины то поменять на id главного(тот который мы оставим главным из всех дублей). И затем только удаляем дубли. Сначало update потом delete.
  • Вопрос задан
  • 315 просмотров
Решения вопроса 1
Immortal_pony
@Immortal_pony Куратор тега PHP
Выкинуть весь php-код.
Выполнить в БД запросы:

## Загрузка данных из CSV:
LOAD DATA INFILE 'p2.txt' INTO TABLE `table`
    FIELDS TERMINATED BY ';' ENCLOSED BY '"'
    LINES TERMINATED BY '\r\n';

## Удаление дубликатов
ALTER IGNORE TABLE `table` ADD UNIQUE INDEX tmp(column2)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
если нужно из

8558;Рогалик;344
8559;Рогалик;344

сделать
8558;Рогалик;344

(честно - хз что такое "род первой категории" из Вашего описания)

проще всего
1) загнать в базу, Рогалик в отдельное поле
2)оператором DISTINCT выбрать уникальные поля Рогалик
3) собрать из базы строки назад

4*) если нужен "только первый", поиграться с SORT (array)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
04 мая 2024, в 06:10
4000 руб./за проект
04 мая 2024, в 05:49
10000 руб./за проект
04 мая 2024, в 03:57
10000 руб./за проект