我有一张很大的有线的桌子。字段words:
- dog
- champion
- cat
- this is a cat
- pool
- champ
- boots
...在我的示例中,如果select查询正在查找给定的字符串“冠军”,它将找不到它,因为这个字符串不在表中。在这种情况下,我希望查询从表中返回“冠军”,即表中以给定单词“冠军”开头的最长字符串。可能的匹配(如果找到)是表中冠军、…、cham、cha、ch、或C之间最长的匹配。
问:我想在表中返回以给定字符串开头的最长字符串。
我需要高速。有没有一种方法可以创建索引和查询,以便快速执行查询?
发布于 2013-08-12 07:27:27
你对“表中以给定单词”冠军“开头的最长字符串”有点模糊。“冠军”算得上比赛吗?
也许下面的内容会有所帮助。如果你在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-12 07:29:03
下面是一个将返回指定结果的查询:
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-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
解决方案模式如下所示:
select words
from (
select words
from yourtable
where words <= 'championship'
order by words desc
limit 1
) tmp
where 'championship' like concat (words, '%')https://stackoverflow.com/questions/18177569
复制相似问题