MySql выбрать с лайком и присвоить вес в зависимости от количества найденных подстрок - PullRequest
1 голос
/ 03 августа 2020

У меня есть таблица (книги)

id, title

Я сделал выбор с совпадением REGEXP

select title 
from books 
where title REGEXP "word1|word2|...|wordn"

Как мне узнать, сколько слов я нашел в заголовке, чтобы получить такой запрос?

select title, numberofwordsfound 
from books 
where title REGEXP "word1|word2|...|wordn"

Заранее всем спасибо :)

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Вы можете использовать трюк с regexp_replace() и группами захвата:

select title,
       length(regexp_replace(title, '(word1|word2|...|wordn)', '$1x')) - length(title) as num_matches
from books 
where title REGEXP 'word1|word2|...|wordn';

Здесь - скрипт db <>.

1 голос
/ 03 августа 2020

Один вариант использует производную таблицу для перечисления слов, а затем агрегацию:

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
...