Сделано в Раскрутке

Архив эхоконференции RU.PHP

- RU.PHP ------------------------------------------------------------- RU.PHP -
 Msg  : #12036 [566]
 От   : Nikolai Chuvakhin             2:5020/175.2        06 января 05, 01:30
 Кому : Anton Toporow                                     06 января 05, 19:59
 Тема : Подаскажите наиболее оптимальный...
-------------------------------------------------------------------------------
From: "Nikolai Chuvakhin" 

Thu Jan 06 2005 00:40, Anton Toporow wrote to All:

AT> Подскажите наиболее оптимальный алгоритм поиска одинаковых
AT> записей в MySQL таблице и их удаление...

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

Чтобы решить текущую проблему, надо понять, как Вы определяете 
одинаковость записей -- по одному полю или по нескольким. 
Допустим, есть таблица `records`, из которой надо удалить все 
записи, в которых поле `dupe` дублируется. Можно это сделать 
примерно так: 

$count = 1000; 
$total = 0; 
$ids = array(); 
$res = mysql_query('SELECT id, dupe FROM records ORDER BY dupe'); 
$current = mysql_fetch_array($res);  
while ($next = mysql_fetch_array($res)) {
  if ($current['dupe'] == $next['dupe']) {
    $ids[] = $next['id']
  } else {
    $current = $next; 
  }
  if (count($ids) >= $count) {
    mysql_query('DELETE FROM records WHERE id IN (' . 
                implode(',', $ids) . 
                ')'); 
    $total = $total + mysql_affected_rows(); 
    $ids = array(); 
  }
}
if (count($ids) > 0) {
  mysql_query('DELETE FROM records WHERE id IN (' . 
              implode(',', $ids) . 
              ')'); 
  $total = $total + mysql_affected_rows(); 
}
echo "

$total duplicate records deleted.

"; AT> дублирующихся записей может быть много... как быть... А вот так и быть -- пересмотреть архитектуру данных и/или процедуры взаимодействия программы с базой данных. AT> если всю логику повесить на php то не укладываемся в 30 сек... Hу и что? Запускайте приведенный выше скрипт несколько раз... Если он совсем не работает (т.е., с самого начала печатает "0 duplicate records deleted"), уменьшите значение $count в первой строке. С уважением, Hиколай Чувахин --- ifmail v.2.15dev5 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)
При переходе по баннеру - скидка 25% на первый месяц обслуживания!
Самый простой способ получить ROOT-доступ
При переходе по баннеру - скидка 25% на первый месяц обслуживания!