здравствуйте . имеется сайт на дле где много одинаковых новостей. есть что нибудь что может решить эту проблему? заранее спасибо
Хм. Спасибо но немного не то. Там не дубликаты одной новости. Например- Новость1 (и в бд еще допустим 5 таких новостей с таким же названием) Новость2 (и в бд еще 5 таких новостей с таким же названием) Нужно удалить дубликаты и чтоб осталась 1 оригинальная. Новостей всего около 30 000. Вручную нереально перебирать
конечно я не имею понятия какая структура таблицы но все же. делать будем в 3 этапа=) если заголовки статей хранаяться в отделном столбце то зб, тоесть структура такова: id-label-text ну и еще дх полей... вот если label это заголовок статьи, и они встречаються не уникальные то делаем так: создаем 1 временную табличку, в 1 полем, назовем id, таблу назовем ids копируем в нее ид уникальных статей insert into ids (id) SELECT DISTINCT id FROM dle_news GROUP BY label а потом delete from dle_news where id not in (select id from ids) если не понятно стукни в аську объясню=)
ап. проблема до сих пор не решена. еще раз повторюсь что я не знаю ид уник новостей. их очень много. зы бд уже 60к новостей и еще . например -новость №1 -новость №1 2008 такие тоже желательно бы поудалять. я в полном недоумении думаю что только можно решить этот вопрос через поиск определенногопроцента совпадения в названиях.(Т.е. если в названии новости совпадают 3-4 слова и более, то добавит эти новости в список удаления, после чего я уже сам посмотрю, что в этом списке надо удалить,а что нет...) но к сожалению данную идею реализовать не могу т.к не мой уровень( заранее благодарен
Ну создай скрипт который будет выводить дубликаты select * from dle_post where title LIKE '%новость №1%' далее выбираешь что удалить и удаляешь DELETE FROM dle_post WHERE id = (id новости которую надо удалить)
мазахизм,но в дле есть функция замены быстрого текста во всей дле... найди где именно выполняеться код и вместо замены скажи что бы удалял все похожее....
мля..вы не понимаете вот наглядный пример _pswarez.net/index.php?newsid=54997 - новость Перевозчик 3 / Transporter 3 (2008) смотрим поле Другие новости по теме: посмотрите чем отличаются от этой Перевозчик 3 Transporter 3 (2008) TS Перевозчик 3 / Transporter 3 (2008) DVDRip+700Mb Перевозчик 3 / Transporter 3 (2008) DVDRip Перевозчик 3. Transporter 3 2008/TS Перевозчик 3 / Transporter 3 (2008) DVDRip и это только 5 первых похожих. думаю там их гораздо больше и подобных новостей много. фильмы и софт. и ПОЭТОМУ ИД уникальных новостей не знаю. прочитайте еще раз про идею процентного соотношения.
Можно написать хп. Получится нечто вродь такого Code: delimiter ;; CREATE PROCEDURE cl() BEGIN DECLARE done INT DEFAULT 0; DECLARE s VARCHAR(100); DECLARE cur CURSOR FOR SELECT DISTINCT SUBSTRING_INDEX(`title`,' ',2) FROM `table`; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN cur; REPEAT FETCH cur INTO s; DELETE FROM `table` WHERE `id` IN (SELECT `t1`.`id` FROM (SELECT * FROM `table`) as `t1` WHERE `t1`.`title` LIKE CONCAT(s,'%') AND `id` <> (SELECT `t2`.`id` FROM (SELECT * FROM `table`) as `t2` WHERE `t2`.`title` LIKE CONCAT(s,'%') LIMIT 1)); UNTIL done END REPEAT; END;; Вызывается хп так: Code: call cl() где cl - эт имя нашей поцедуры. Объясним некоторые специфические моменты: SUBSTRING_INDEX(`title`,' ',2) - это по сути то, сколько ведущих слов нам брать. Слова разделяются пробелами. Например если этот код применить к строке "Перевозчик 3 Transporter 3 (2008) TS" получим "Перевозчик 3" FROM (SELECT * FROM `table`) - такой финт ушами понадобился всвязи с некоторыми особенностями мускула CONCAT(s,'%') - соответственно объединяем получанную нами из курсора строку со знаком % для составления шаблона. Может код неоптимален и тд и тп - но он будет работать Если найдешь что оптимизировать - оптимизируй. P.S. На достаточно большой базе при слабой машине - вполне можешь повесить субд. Или выполнение может занять продолжительное время.
ИМХО, легче набрать пяток модераторов, которые разберут эти авгиевы конюшни, а потом будут следить, чтобы не выкладывали по 10 раз одно и то же
Gifts автоматизция- великая вещь. Главное с умом подходить Можно на стройке и кирпичи на 30-й этаж на горбу таскать - однако ж для чего то придумали подъемные краны, блоки и другие хитроумные приспособления =)
ну ну... однажды что-то не так пойдет, что то не так удалится из базы.. лучше пусть модеры ручками поработают.. тем более что не слишком сложная работа. хотя не спорю что автоматизация - это хорошая вещь(=
А бэкапы на что? Легче восстановить новости за пол дня (а то и меньше - ночной бэкап + лог журналов), чем удалять 30к записей или больше вручную =)
естественно проверяется. если название точ в точь одинаковое то новость не добавится. постят боты =\ дык они в конце слеш допишут и все(((
Точно так же - проверяешь процент совпадения, или первые n слов. Можно впринципе даж триггер на добавление в данную таблицу повесть - и в нем проверять. Но что лучше конечн виднее тому, кто проектировал систему
VDShark А что делать с разными версиями программы? Например PHP 5.2.6, PHP 5.2.8 Будут считаться одинаковыми, тоже самое с фильмами - Перевозчик ТС, Перевозчик DVDRip, Перевозчик HDRip Будут тоже беспощадно удаляться. Любое удаление без участия человека будет обречено удалить не то и не так. Если же хочется как-то автоматизировать, то стоит присмотреться к ПХПшной функции нахождения расстояния левенштейна и к такой ее реализации: PHP: function _levenshtein($str1, $str2) { return 1-levenshtein($str1, $str2)/max(strlen($str1), strlen($str2)); } Где $str1 - название новой новости, а в $str2 подставлять все уже существующие названия. Если функция вернет величину больше 25, то отправлять на проверку модераторам. Функция правда тяжеловесная и обрабатывать данные будет долго.