MySQL——按子字符串匹配索引排序

标签 mysql sql regex database search

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

输入查询:Micro

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实现。如果是的话怎么办?还有什么替代方案?

最佳答案

虽然可能存在以下情况不起作用的异常(exception)情况,但对于大多数情况来说它可能已经足够了:

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

也就是说,仅匹配名称中以“Micro”开头的名称。然后按照“Micro”距离单词前面的距离的顺序返回它们。我怀疑有很多名字中都有两次“Micro”——如果确实如此,那么每次出现都很有可能以一个单词开头。

关于MySQL——按子字符串匹配索引排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29252314/

相关文章:

mysql - MariaDB 默认 float 不能包含小数位

php - 表中的 SUM 点

C++ regex Visual Studio Community 2015 <regex> 给出意外结果

php - 如何在php mysql中获取父名称?

php - 选择组合框值后填充文本框

c# - SQL查询结果到变量?

java - 如何处理给定模式的整个单词?

mysql - SQL 查询从表的一行中提取一些行

mysql - 按版本和字母顺序对设备进行排序,并返回该手机的所有版本

javascript - .NET 和 javascript 之间正则表达式 anchor 的差异