- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Что делать, если ваша email-рассылка попала в спам
10 распространенных причин и решений
Екатерина Ткаченко
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
В общем есть задача - удалить дубли записей в доске объявлений по признаку - совпадение 2 полей - заголовок и содержание.
как я сделал:
Вот в чем проблема: к примеру есть запись 3811 и её дубли 2331, 2207.
так вот при переборе всех значений с $sql я не знаю как пометить или удалить только дубли, чтобы не стереть оригинал.
пробовал ставить дополнительное поле flag - чтобы в нем помечать дубли, неполучилось, и ли как то удалять дубли из $sql ?
Самое простое.
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'].... ну и так далее.
То есть удаляете записи с тем же текстом и заголовком объявления, но имеющими другие ИД - то есть дублями.
А как из массива $sql удалить дублирующиеся записи из массива $result?
У меня удаляются и дубли и начальная запись.
По какому правилу вы оригинал распознаете?
Ну просто перебором делаю все строки из массива $sql.
while ($row = mysql_fetch_array($sql))
И если есть какие то дубли строки $row[n] в $result, то все что в $result - дубли, а $row[n] - оригинал.
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']}'");
}
}
}
Может быть так?
`id`>'{$id}' AND
Может как-то так? т.е. чтобы id был больше текущего и он не искал записи предыдущие ибо зачем?
Почему то не работает ORDER BY 'id'
вывожу echo $id и индесы такие:
1
4
10505
10506
12
13
14
20
21
22
19
23
а хочу отсортированные по возрастанию
А так мысль LEOnidUKG решила все проблемы!
ORDER BY `id` ASC
Всё получилось, вот только интересно, почему не работало удаление элемента $row2 с массива $sql:
while ($row2 = mysql_fetch_array($result)) {
$id2 = $row2[0];
...
unset($sql['$id2']);
Удаление скорее всего работает, просто индекс не пересчитывается. Это надо делать вручную.