首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回表中存在的"champion“的最佳方法,以防找不到给定的查询”冠军“

问返回表中存在的"champion“的最佳方法,以防找不到给定的查询”冠军“
EN

Stack Overflow用户
提问于 2013-08-12 07:02:10
回答 3查看 105关注 0票数 0

我有一张很大的有线的桌子。字段words:

代码语言:javascript
复制
- dog
- champion
- cat
- this is a cat
- pool
- champ
- boots
...

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

问:我想在表中返回以给定字符串开头的最长字符串。

我需要高速。有没有一种方法可以创建索引和查询,以便快速执行查询?

EN

回答 3

Stack Overflow用户

发布于 2013-08-12 07:27:27

你对“表中以给定单词”冠军“开头的最长字符串”有点模糊。“冠军”算得上比赛吗?

也许下面的内容会有所帮助。如果你在words上有一个索引,那么下面的代码将返回给定单词之前的最后一个单词。它应该最大化匹配的初始序列:

代码语言:javascript
复制
select word
from t
where words <= 'championship'
order by words desc
limit 1;

这并不完全是您所要求的,但它在实践中可能会起作用。

编辑:

如果你正在寻找一个精确的匹配,那么下面的代码应该有效地对单词使用索引并返回你想要的:

代码语言:javascript
复制
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;

这有点蛮力,但它应该具有使用索引来加快查询速度的属性。

票数 0
EN

Stack Overflow用户

发布于 2013-08-12 07:29:03

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

代码语言:javascript
复制
SELECT t.mycol
  FROM mytable t 
 WHERE 'championship' LIKE CONCAT(t.mycol,'%')
 ORDER
    BY LENGTH(t.mycol) DESC
 LIMIT 1

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

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

代码语言:javascript
复制
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

-或者--

代码语言:javascript
复制
  AND t.mycol >= 'cham' 
  AND t.mycol <  'chan'
票数 0
EN

Stack Overflow用户

发布于 2013-08-12 14:13:56

看看这篇文章:

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

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

How to use index efficienty in mysql query

解决方案模式如下所示:

代码语言:javascript
复制
select words
  from (
        select words
          from yourtable
         where words <= 'championship'
         order by words desc
         limit 1
       ) tmp
 where 'championship' like concat (words, '%')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18177569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档