Один вариант использует производную таблицу для перечисления слов, а затем агрегацию:
select b.id, b.title, count(*) no_matches
from books b
inner join (
select 'word1' word
union all select 'word2'
union all select 'word3'
) w on b.title like concat('%', w.word, '%')
group by b.id, b.title
order by no_matches desc
В самых последних версиях MySQL вы можете использовать VALUES()
конструктор строк для перечисления слов, что сокращает запрос:
select b.id, b.title, count(*) no_matches
from books b
inner join (values(row('word1'), row('word2'), row('word3')) b(word)
on b.title like concat('%', w.word, '%')
group by b.id, b.title
order by no_matches desc
Предполагается, что «слова» - это всего лишь слова. Если они содержат шаблоны регулярных выражений, вам нужно использовать совпадение регулярных выражений вместо like
:
on b.title regexp w.word