0

我有一张很大的桌子,上面有绳子。字段“单词”:

- dog
- champion
- cat
- this is a cat
- pool
- champ
- boots
...

在我的示例中,如果选择查询正在查找给定的字符串“championship”,它不会找到它,因为该字符串不在表中。在这种情况下,我希望查询从表中返回“champion”,即表中以给定单词“championship”开头的最长字符串。可能的匹配项(如果找到)是冠军、冠军、冠军、冠军、...、cham、cha、ch 或 C 之间最长的匹配项。

问题:我想返回表中以给定字符串开头的最长字符串。
我需要高速。有没有办法创建索引和查询以便快速执行查询?

4

3 回答 3

0

您对“表中以给定单词“championship”开头的最长字符串有点模糊。“冠军”算不算一场比赛?

也许以下内容会有所帮助。如果您对 有索引words,则以下内容将返回给定单词之前的最后一个单词。它应该最大化匹配的初始序列:

select word
from t
where words <= 'championship'
order by words desc
limit 1;

这并不完全是您所要求的,但它可能在实践中有效。

编辑:

如果您正在寻找完全匹配,那么以下内容应该有效地使用单词索引并返回您想要的内容:

select word
from t
where word in ('championship', 'championshi', 'championsh', 'champions', 'champion',
               'champio', 'champi', 'champ', 'cham', 'cha', 'ch', 'c')
order by word desc
limit 1;

有点蛮力,但应该有使用索引来加速查询的特性。

于 2013-08-11T23:27:26.573 回答
0

看看这篇文章:

http://blog.fatalmind.com/2010/09/29/finding-the-best-match-with-a-top-n-query/

它解释了这个 SO 问题的解决方案:

如何在mysql查询中使用索引效率

解决方案模式如下所示:

select words
  from (
        select words
          from yourtable
         where words <= 'championship'
         order by words desc
         limit 1
       ) tmp
 where 'championship' like concat (words, '%')
于 2013-08-12T06:13:55.537 回答
0

这是一个将返回指定结果的查询:

SELECT t.mycol
  FROM mytable t 
 WHERE 'championship' LIKE CONCAT(t.mycol,'%')
 ORDER
    BY LENGTH(t.mycol) DESC
 LIMIT 1

此查询不能进行索引范围扫描,它必须是全扫描,但它可能能够使用索引来满足查询。

如果您可以将搜索限制为有限数量的需要匹配才能被视为“命中”的前导字母,则可以包含另一个谓词。例如,要匹配至少 4 个字符:

SELECT t.mycol
  FROM mytable t 
 WHERE 'championship' LIKE CONCAT(t.mycol,'%')
   AND t.mycol LIKE 'cham%'
 ORDER
    BY LENGTH(t.mycol) DESC
 LIMIT 1

- 或者 -

  AND t.mycol >= 'cham' 
  AND t.mycol <  'chan'
于 2013-08-11T23:29:03.253 回答