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;;
Вызывается хп так:
Код:
call cl()
где cl - эт имя нашей поцедуры.
Объясним некоторые специфические моменты:
SUBSTRING_INDEX(`title`,' ',2) - это по сути то, сколько ведущих слов нам брать. Слова разделяются пробелами. Например если этот код применить к строке "Перевозчик 3 Transporter 3 (2008) TS" получим "Перевозчик 3"
FROM (SELECT * FROM `table`) - такой финт ушами понадобился всвязи с некоторыми особенностями мускула
CONCAT(s,'%') - соответственно объединяем получанную нами из курсора строку со знаком % для составления шаблона.
Может код неоптимален и тд и тп - но он будет работать Если найдешь что оптимизировать - оптимизируй.
P.S. На достаточно большой базе при слабой машине - вполне можешь повесить субд. Или выполнение может занять продолжительное время.