Удаление дублей записей.

12
SEO-MAN
На сайте с 25.06.2007
Offline
187
1105

В общем есть задача - удалить дубли записей в доске объявлений по признаку - совпадение 2 полей - заголовок и содержание.

как я сделал:


$sql = mysql_query("SELECT * FROM `jos_adsmanager_ads` WHERE `ad_price` != '' AND `ad_phone` != ''");
...
while ($row = mysql_fetch_array($sql))
$id = $row[0];
$head = $row[8]; // загловок
$text = $row[9]; // содержание
...
// ищем дубли и помещаем их в $result
$result = mysql_query("SELECT * FROM `jos_adsmanager_ads` WHERE `id`!='{$id}' AND `ad_text` = '{$text}' AND `ad_headline` = '{$head}');
$num_r = mysql_num_rows($result); //кол-во дублей
if ($num_r >0){
while ($row2 = mysql_fetch_array($result)) {
$id2 = $row2[0]; // ид дубля
// проблема
}

Вот в чем проблема: к примеру есть запись 3811 и её дубли 2331, 2207.

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

пробовал ставить дополнительное поле flag - чтобы в нем помечать дубли, неполучилось, и ли как то удалять дубли из $sql ?

Форум сео (http://forum-seo.net) для новичков автоматическая регистрация в 30000 каталогах за 5$ (/ru/forum/157861) Нужна доработка 2 досок объявлений - avtopmr.net, pmrdom.com (вип объявления и удаление дублей)
edogs software
На сайте с 15.12.2005
Offline
775
#1

Самое простое.


ALTER IGNORE TABLE `jos_adsmanager_ads` ADD UNIQUE TMPX ( `ad_text` , `ad_headline` );
ALTER TABLE `jos_adsmanager_ads` DROP INDEX `TMPX` ;

Смысл - вешается уникальный индекс, соответственно в таблице могут быть только уникальные пары ad_text/ad_headline. ignore - позволяет проигнорировать лишние дубли в "новой" таблице с индексом. потом индекс удаляется - остается только 1 запись.

Если хотите чисто на php решение, то все тоже достаточно просто. В общих чертах так

select distinct(id), ad_text, ad_headline from jos_adsmanager_ads group by ad_text,ad_headline - выбираете по одному уникальному ид из таблицы для каждой группы ad_text/ad_headline

потом в цикле делаете нечто вроде

$sql="delete from jos_adsmanager_ads where id<>'.$row['id'].' and ad_text='.mysql_real_escape_string($row['ad_text'].... ну и так далее.

То есть удаляете записи с тем же текстом и заголовком объявления, но имеющими другие ИД - то есть дублями.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
SEO-MAN
На сайте с 25.06.2007
Offline
187
#2

А как из массива $sql удалить дублирующиеся записи из массива $result?

У меня удаляются и дубли и начальная запись.

ne0n91
На сайте с 28.03.2011
Offline
58
#3

По какому правилу вы оригинал распознаете?

SEO-MAN
На сайте с 25.06.2007
Offline
187
#4

Ну просто перебором делаю все строки из массива $sql.

while ($row = mysql_fetch_array($sql))

И если есть какие то дубли строки $row[n] в $result, то все что в $result - дубли, а $row[n] - оригинал.

ne0n91
На сайте с 28.03.2011
Offline
58
#5
$sql = mysql_query("SELECT id FROM `jos_adsmanager_ads` WHERE `ad_price` != '' AND `ad_phone` != ''");

while($row = mysql_fetch_assoc( $sql )){

$double = mysql_query("SELECT id FROM `jos_adsmanager_ads` WHERE `ad_text` = '{$row['text']}' AND `ad_headline` = '{$row['head']}');

while($dub = mysql_fetch_assoc( $double )){

if( $dub['id'] != $row['id'] ){

mysql_query("DELETE FROM `jos_adsmanager_ads` WHERE id='{$dub['id']}'");
}
}
}

Может быть так?

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#6
так вот при переборе всех значений с $sql я не знаю как пометить или удалить только дубли, чтобы не стереть оригинал.

`id`>'{$id}' AND

Может как-то так? т.е. чтобы id был больше текущего и он не искал записи предыдущие ибо зачем?

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
SEO-MAN
На сайте с 25.06.2007
Offline
187
#7

$sql = mysql_query("SELECT * FROM `jos_adsmanager_ads` WHERE `ad_headline` != '' AND `ad_text` != '' AND `ad_price` != '' AND `ad_phone` != '' ORDER BY 'id' ASC");

Почему то не работает ORDER BY 'id'

вывожу echo $id и индесы такие:

1

4

10505

10506

12

13

14

20

21

22

19

23

а хочу отсортированные по возрастанию

А так мысль LEOnidUKG решила все проблемы!

siv1987
На сайте с 02.04.2009
Offline
427
#8

ORDER BY `id` ASC

SEO-MAN
На сайте с 25.06.2007
Offline
187
#9

Всё получилось, вот только интересно, почему не работало удаление элемента $row2 с массива $sql:


while ($row2 = mysql_fetch_array($result)) {
$id2 = $row2[0];
...
unset($sql['$id2']);
LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#10

Удаление скорее всего работает, просто индекс не пересчитывается. Это надо делать вручную.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий