- 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% на первый месяц обслуживания! При переходе по баннеру - скидка 25% на первый месяц обслуживания!