我有一张有公司(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实现。如果是的话怎么样?还有什么选择?
答案 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)。 按第一场比赛的字符索引排序。