MySQL - 按子串匹配索引排序

时间:2015-03-25 09:50:54

标签: mysql sql regex database search

我有一张有公司(id,name)的表。 在我必须针对使用“like”处理的记录搜索输入查询之前。有时客户端希望它以输入查询结束,有时它可能会在某个时间发生它应该从它开始。所以我使用了“喜欢”的不同变体

输入查询:微

select * from Company where CompanyName like "Micro%";
select * from Company where CompanyName like "%Micro%";
select * from Company where CompanyName like "%Micro";

非常简单吧。现在变化开始出现,并不像“喜欢”那样容易处理。就像在一开始的单词中搜索查询一样。与上述相同的输入查询一样,结果集应包含

Microcompany Something
Something Somethin Microcompany
Something Microcompany

所以我转而使用Regular Expressions

现在我的查询变成了

select * from company where CompanyName regexp '[[:<:]]Micro';

问题:现在我希望结果按最接近的匹配索引排序。我的意思是在接近0的索引上发生匹配的那个将首先出现,然后是其他的。对于上述搜索结果,应按以下顺序排列。

Microcompany Something
Something Microcompany
Something Somethin Microcompany

是否可以通过MySQL实现。如果是的话怎么样?还有什么选择?

2 个答案:

答案 0 :(得分:1)

虽然可能存在例外情况,但以下情况不起作用,对大多数情况来说可能已经足够了:

select *
from company
where CompanyName regexp '[[:<:]]Micro'
order by instr( CompanyName, 'Micro');

也就是说,只匹配“Micro”在名称中开始一个单词的名称。然后按照“Micro”与单词前面的接近顺序返回它们。我怀疑有很多名字在名称中有两次“Micro” - 如果他们这样做,那么很有可能每次都会出现一个单词。

答案 1 :(得分:0)

select * from company where instr( CompanyName, 'Micro' ) > 0 order by instr( CompanyName, 'Micro' );

排除不包含搜索短语的条目(index == 0)。 按第一场比赛的字符索引排序。