Вы можете попробовать следующее:
SELECT object, FLOOR(((CHAR_LENGTH(object) - CHAR_LENGTH(REPLACE(object, 'keyword', ''))) / CHAR_LENGTH('keyword'))) AS cnt_matches
FROM object o
WHERE o.object LIKE '%keyword%'
HAVING cnt_matches > 3
Вы также можете создать функцию для повторного использования этого выражения:
DELIMITER //
CREATE FUNCTION GetStringCount(strValue VARCHAR(200), charValue VARCHAR(200))
RETURNS INTEGER DETERMINISTIC NO SQL
BEGIN
RETURN (CHAR_LENGTH(strValue) - CHAR_LENGTH(REPLACE(strValue, charValue, ''))) / CHAR_LENGTH(charValue);
END
Таким образом, ваш запрос выглядит так:
SELECT object, GetStringCount(object, 'keyword') AS cnt_matches
FROM object o
WHERE o.object LIKE '%keyword%'
HAVING cnt_matches > 3
демо на dbfiddle.uk