ProfiPHPProfiPHP
Категория: Полезное в PHP

Удаление одинаковых строк из таблицы в SQL

Опишем ситуацию, когда необходимо удалить все повторяющиеся строки в базе данных. Допустим, в таблице содержаться только цифры ID, которые указывают на уникальные идентификаторы из других таблиц.

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

И так, для начала пройдемся по всем записям таблицы:
$sql_result = $db->query( "SELECT * FROM `table`" );
В примере использован класс для работы с базой данных MySQL.

Далее в массив $arrayAll добавил все MD5 значение необходимых полей (поскольку в записях содержатся исключительно цифры, их хеширование будет происходить очень быстро):
$arrayAll = array(  );
while ( $row = $db->get_row( $sql_result ) ) {
$arrayAll[$row['id']] = md5( $row['first'].$row['second'].$row['third'] );
}
После выполнения данного кода мы получим массив результатов:
Array
(
[9] => 16139767a2e5a261e378a6cf8d7a3532
[11] => 9ad59b645add8660e474d616480af943
...
[13602] => 1def8674c7e47d05875264f5a9e507dd
[13603] => daec1f48cfa19cd32a6c410d07bdf918
)
После этого, с помощью функции Array_count_values создаем массив, ключами которого являются значения массива, а значениями - частота повторения значений. Делается это для того, чтобы узнать количество повторяющихся элементов.
$array_cv = array_count_values( $arrayAll );
Получится массив:
Array
(
[16139767a2e5a261e378a6cf8d7a3532] => 1
[9ad59b645add8660e474d616480af943] => 1
[f74f71ac35617a5cd6c400319e127d27] => 2
[a7054f49f966ac87195741151843cec6] => 1
[f74f71ac35617a5cd6c400319e127d27] => 2
[daec1f48cfa19cd32a6c410d07bdf918] => 1
)
Далее остается только перебрать массив и найти записи, которых больше 1. После этого удаляем повторяющееся значение:
foreach ( $array_cv as $key => $value ) {
if ( $value > 1 ) {
$id = array_search( $key, $arrayAll );
$db->query( "DELETE FROM `table` WHERE ( `id` = '{$id}' )" );
}
}
Функция Array_search возвращает ключ элемента массива, который будет ID идентификатором строки для удаления.
Если существуют более двух одинаковых строк, необходимо запустить скрипт несколько раз!

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

После удаления всех повторяющихся строк не забудьте добавить условия проверки наличия в таблице новых данных, чтобы потом снова не удалять дубликаты.

Добавить комментарий

Имя:
Текст комментария: