Решение с помощью MySQL будет, мягко говоря. не очень изящным из-за весьма убогого функционального набора.
Нам потребуется вспомогательная
функция удаления лишних пробелов:
CREATE FUNCTION DELETE_DOUBLE_SPACES ( title VARCHAR(250) )
RETURNS VARCHAR(250) DETERMINISTIC
BEGIN
DECLARE result VARCHAR(250);
SET result = REPLACE( title, ' ', ' ' );
WHILE (result <> title) DO
SET title = result;
SET result = REPLACE( title, ' ', ' ' );
END WHILE;
RETURN result;
END;
Таблица для хранения стоп-слов:
create table stop_words(
word VARCHAR(20) NOT NULL ,
PRIMARY KEY (word)
) ENGINE = InnoDB CHAR SET utf8 COLLATE utf8_general_ci;
И собственно сам триггер BEFORE INSERT:
CREATE TRIGGER check_column BEFORE INSERT ON table_name FOR EACH ROW
BEGIN
DECLARE var_censored_string VARCHAR(255);
DECLARE done BOOLEAN DEFAULT false;
DECLARE var_current_stop_word VARCHAR(20);
DECLARE stop_words_list CURSOR FOR select word from stop_words;
DECLARE CONTINUE HANDLER FOR NOT FOUND set done = true;
SET var_censored_string = NEW.line_name;
-- убираем стоп-слова
OPEN stop_words_list;
`IterateStopWords`: LOOP
FETCH `stop_words_list` INTO var_current_stop_word;
IF done THEN
LEAVE `IterateStopWords`;
END IF;
SET var_censored_string = REPLACE(var_censored_string, var_current_stop_word, '');
END LOOP `IterateStopWords`;
-- убираем лишние пробелы
SET var_censored_string = trim(DELETE_DOUBLE_SPACES(var_censored_string));
-- берем первые три слова
SET var_censored_string = SUBSTRING_INDEX(var_censored_string, ' ', 3);
SET NEW.line_name = var_censored_string;
END;
Аналогичный для BEFORE UPDATE, если нужен. А вообще проще это в php сделать, потому что там explode() есть, который по-людски работает.