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
select title,
length(regexp_replace(title, '(word1|word2|...|wordn)', '$1x')) - length(title) as num_matches
from books
where title REGEXP 'word1|word2|...|wordn';
2条答案
按热度按时间l7mqbcuq1#
一个选项使用派生表列出单词,然后进行聚合:
在mysql的最新版本中,您可以使用
VALUES()
行构造函数来枚举单词,从而缩短查询:这假设“词”就是那个词。如果它们包含正则表达式模式,则需要使用正则表达式匹配,而不是
like
:plupiseo2#
你可以用一个技巧
regexp_replace()
和捕获组:这是一把小提琴。