За последние 24 часа нас посетили 21976 программистов и 1110 роботов. Сейчас ищут 733 программиста ...

Как отсеивать дубликаты средствами PHP при записи в базу SQL

Тема в разделе "Подворотня", создана пользователем skorpion, 6 дек 2019.

  1. skorpion

    skorpion Активный пользователь

    С нами с:
    6 фев 2011
    Сообщения:
    56
    Симпатии:
    1
    Адрес:
    Москва
    Всем привет!

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

    PHP:
    1. $result = $mysqli->query("INSERT INTO ".$db_table_to." (remote_sql_id,remote_sql_type,remote_sql_datetime,blok_01,blok_02,blok_03,blok_04,blok_05,blok_06,blok_07,blok_08,blok_09,blok_10,blok_11,blok_12,blok_13,blok_14,blok_15,blok_16,blok_17,blok_18,blok_19,blok_20,blok_21,blok_22,blok_23,blok_24,blok_25,blok_26,blok_27,blok_28,blok_29,blok_30,blok_31,blok_32,blok_33,blok_34,blok_35,blok_36,blok_37,blok_38,blok_39,blok_40,blok_41,blok_42,blok_43,blok_44,blok_45,blok_46,blok_47,blok_48,blok_49,blok_50,blok_51,blok_52,blok_53,blok_54,blok_55,blok_56,blok_57,blok_58,blok_59,blok_60,blok_61,blok_62,blok_63,blok_64,blok_65,blok_66,blok_67,blok_68,blok_69,blok_70,blok_71,blok_72,blok_73,blok_74,blok_75,blok_76,blok_77,blok_78,blok_79,blok_80,blok_81,blok_82,blok_83,blok_84,blok_85,blok_86,blok_87,blok_88,blok_89,blok_90,blok_91,blok_92,blok_93,blok_94,blok_95,blok_96,blok_97,blok_98,blok_99,blok_100) VALUES ('$data_sql01','$data_sql02','$data_sql03','$blok_01','$blok_02','$blok_03','$blok_04','$blok_05','$blok_06','$blok_07','$blok_08','$blok_09','$blok_10','$blok_11','$blok_12','$blok_13','$blok_14','$blok_15','$blok_16','$blok_17','$blok_18','$blok_19','$blok_20','$blok_21','$blok_22','$blok_23','$blok_24','$blok_25','$blok_26','$blok_27','$blok_28','$blok_29','$blok_30','$blok_31','$blok_32','$blok_33','$blok_34','$blok_35','$blok_36','$blok_37','$blok_38','$blok_39','$blok_40','$blok_41','$blok_42','$blok_43','$blok_44','$blok_45','$blok_46','$blok_47','$blok_48','$blok_49','$blok_50','$blok_51','$blok_52','$blok_53','$blok_54','$blok_55','$blok_56','$blok_57','$blok_58','$blok_59','$blok_60','$blok_61','$blok_62','$blok_63','$blok_64','$blok_65','$blok_66','$blok_67','$blok_68','$blok_69','$blok_70','$blok_71','$blok_72','$blok_73','$blok_74','$blok_75','$blok_76','$blok_77','$blok_78','$blok_79','$blok_80','$blok_81','$blok_82','$blok_83','$blok_84','$blok_85','$blok_86','$blok_87','$blok_88','$blok_89','$blok_90','$blok_91','$blok_92','$blok_93','$blok_94','$blok_95','$blok_96','$blok_97','$blok_98','$blok_99','$blok_100')");
    Как проверить эту запись средствами php на уникальность и если есть дубли запись не производить?
     
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    это уже не правильный ход мыслей
     
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Какую эту запись? Записи в таблице должны различаться по значению первичного ключа, уник. индекса. Все средства контроля возникновения «дублирующегося ключа» в СУБД имеются.

    o_O
     
  4. skorpion

    skorpion Активный пользователь

    С нами с:
    6 фев 2011
    Сообщения:
    56
    Симпатии:
    1
    Адрес:
    Москва
    Примерно очень грубо говоря
    PHP:
    1. $dubl_01 = "01";
    2. $dubl_02 = "02";
    3. $dubl_03 = "03";
    4. $dubl_04 = "04";
    5. $dubl_05 = "05";
    6. $dubl_06 = "06";
    7. $dubl_07 = "07";
    8. $dubl_08 = "08";
    9. $dubl_09 = "09";
    10. $dubl_10 = "10";
    11.  
    12. $dubl_blok = $dubl_01.$dubl_02.$dubl_03.$dubl_04.$dubl_05.$dubl_06.$dubl_07.$dubl_08.$dubl_09.$dubl_10;
    13.  
    14. if ($dubl_blok = $dubl_blok) {
    15.     echo "Совпадения зафиксированы";
    16.     echo "<br>Запись <b style='color:red;'>пропущена</b>";
    17. } else {
    18.     echo "Совпадения не найдены";
    19.     echo "<br>Запись <b style='color;green;'>выполнена</b>";
    20.    $result=$mysqli->query("INSERT INTO ".$db_table_to." (remote_sql_id,remote_sql.....куча блоков.);
    21. }
     
  5. skorpion

    skorpion Активный пользователь

    С нами с:
    6 фев 2011
    Сообщения:
    56
    Симпатии:
    1
    Адрес:
    Москва
    Перед разложением на блоки - изначальные данные уже выводятся с использованием "DISTINCT "
    $qr_result = mysql_query("SELECT DISTINCT data FROM log LIMIT 10000 OFFSET 295437);
    но после разложения на блоки - все равно могут появляться дубли. и вот их бы как то отсеить
     
  6. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    ORDER BY забыли, без него БД может отдавать данные в любом удобном ей порядке, в том числе и с дублями.
     
  7. skorpion

    skorpion Активный пользователь

    С нами с:
    6 фев 2011
    Сообщения:
    56
    Симпатии:
    1
    Адрес:
    Москва
    $qr_result = mysql_query("SELECT DISTINCT data FROM log ORDER BY id ASC LIMIT 10000 OFFSET 295437);

    дубли не из за этого.
    Когда лог уже "дистинкнут" и разложен на кусочки, из собранных кусочков иногда собираются идентичные данные. и вот их бы как то отсеивать.
     
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    Не очень смысл понял, но если sql то та есть insert on duplicate ignore
     
  9. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Вы ведь точно понимаете, что даже если вы добавляете DISTINCT, LIMIT/OFFSET без указания сортировки на большой выборке всё равно будет отдавать вам дубликаты (как того требует спецификация SQL)?
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    +1

    надо гарантировать отсутствие дублей через уникальный индекс. а чтобы массовая вставка не обламывалась для всей пачки — вставлять с ignore. тогда вставится всё, что не противоречит уникальному индексу.
     
    Roman __construct нравится это.
  11. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    Если абстрагировать задачу от MySql то я бы применил

    https://www.php.net/manual/ru/function.array-unique.php

    Но вообще такое наверное лучше решать средствами mysql - установкой уникального ключа или вроде того.
    --- Добавлено ---
    Там кстати есть один прикол (или был) - если таблица не myisam - то он когда игнорит вставку - автоинкремент на первичном ключе все равно срабатывает)) я помню долго не мог понять что такое с ключами творится))))
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Это, как говорится, моло*бучий фактор. Кто полагается на непрерывность нумерации в автоинкременте, тот очень рискует.
     
  13. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    да по сути оно и не важно, прерывно, непрерывно
     
  14. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    ну, меня в свое время это смутило))
    --- Добавлено ---
    согласен
     
  15. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Даже откат транзакции назад все равно двигает счетчик, потому что иначе можно потерять главное свойство этой штуки - уникальность, короче, счетчик должен расти с каждым обращением к нему )
     
    Roman __construct нравится это.
  16. skorpion

    skorpion Активный пользователь

    С нами с:
    6 фев 2011
    Сообщения:
    56
    Симпатии:
    1
    Адрес:
    Москва
    Спасибо всем за советы. Руководство пришло к выводу что задача в текущем виде поставлена неверно.
    Будем придумывать способ поиска и удаления дублей в конечной выгрузке. Так как не имеет смысла искать дубли в определенном блоке при записи очередных 50000 записей, так как дубли могут быть в "другой партии" записей.

    Если честно пока не придумал как, возможно ввести хэши к записям и по ним отлавливать...
     
  17. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    @skorpion. ))) ты так и не понял про уникальные индексы, чувак

    да, почему бы и не добавить хеши. только ты придёшь в то же место: внутри одной "пачки" хеш уникален, но может повториться в другой пачке.

    ИСПОЛЬЗУЙ УНИКАЛЬНЫЙ ИНДЕКС И НЕ БОЙСЯ ПОВТОРОВ. ИХ НЕ БУДЕТ ПОТОМУ ЧТО ЭТО НЕВОЗМОЖНО.

    изучи INSERT ON DUPLICATE KEY UPDATE и INSERT IGNORE
    ну и REPLACE до кучи
     
  18. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    Тыб лучше описал задачу в целом - мб и помогут с декомпозицией и алгоритмами :)
     
    AlexProg нравится это.
  19. ProStoNub

    ProStoNub Новичок

    С нами с:
    4 сен 2021
    Сообщения:
    8
    Симпатии:
    0
    Научись для начала помогать нормально и писать полные ответы. Твои дубликайт апдейт ничего не делают, кроме синтактической ошибки..достали
    --- Добавлено ---


    повторов не будет, но ошибки выйдут, то что в базе есть такой ключ! Помощники блин.. не умеете обьяснять, не лезьте
     
  20. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Форум – это не школа для тупых, а место для подсказок и обсуждений ;)

    Хотите, чтобы вас за ручку водили, платите бабло «туторам».
     
    artoodetoo нравится это.
  21. ProStoNub

    ProStoNub Новичок

    С нами с:
    4 сен 2021
    Сообщения:
    8
    Симпатии:
    0
    да нет, это место помощи а не издевкам. Если не можешь помочь, идешь лесом. Никто не имеет право унижать людей, самый главный закон РФ выше которого ничего нет.

    Бабло платить, ну да, таким как ты? Не смеши. Были бы деньги, заплатил бы и тут не сидел. Слишком много хотите, бездарные
     
  22. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Ищи в ответах полезное зерно, а не издевки. Говорят, на что мы ориентированы, то и притягиваем, @ProStoNub
     
  23. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Одаренный ты наш, я в общем писал. Что касается меня, с быдлом даже за бабло стараюсь не общаться.
     
  24. ProStoNub

    ProStoNub Новичок

    С нами с:
    4 сен 2021
    Сообщения:
    8
    Симпатии:
    0
    говорят такие же отсталые как и ты. Не дорос ты еще до человека
    --- Добавлено ---
    ахахах, бабло, какое тебе бабло....
     
  25. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    я не удаляю тему и не баню персонажа, хотя меня уже просят. пусть он выплеснет нерастраченный негатив.
    переношу в соответствующий раздел.