我需要返回所有文本结果(如果有的话),它们共享搜索字符串常用的最大长度左边界的有限子字符串。MySQL选择匹配字符串的最大长度
鉴于“的StackOverflow”的搜索中包含
"Stack",
"Sta",
"StackOv",
"StackOverthrow",
"StackOverSlow",
"StackFlow",
"Soverflow",
"StackOverCrow",
"StackOverSlow",
etc.
查询将返回“StackOverthrow”,因为它包含匹配字符的最大数量,以及StackOverSlow和StackOverCrow在一个独特的结果的表列组。 目前,我正在做一些效率低下的事情,首先是对第一个字符进行LIKE搜索,继续重复和扩展搜索字符串,直到找不到任何内容,并保持最后的好结果。
即
select names from table where name like 'XX%';
"S" ->Results
"St"->Results
. .
"StackOver"->Results
"StackOverf"-> No results (Last result returning items beginning with StackOver etc as being the correct answer)
我知道这种做法是极其低效的,任何人都可以提供一个单一查询来实现这个结果?我知道我可以一次搜索所有组合,并筛选代码中最长的结果,但是,我认为数据库应该更好。
编辑1:注意上面的例子有点简化。 DB中绝大多数的数据是在2到10个字符之间,最常见的匹配长度约为3个字符。表中有超过10万条记录。
编辑2:道歉,我需要澄清可能有多个正确的结果,并且结果可能包含需要删除的重复项。目前我选择不同的方法效率低下很容易。
@AnthonyPalmer:通过准备好的语句在一个sproc中构建 - http://sqlfiddle.com/#!2/f8fca/1/0 – eggyal
除了如果查询以非匹配字符开始,返回错误的结果! –
@AnonyPalmer:在这种情况下应该返回什么?我认为,在0个匹配字符中,最长匹配长度为'0',因此每个匹配'0'字符的字符串(即它们全部)应该被返回。 – eggyal