我需要搜索比实际拨号码大的最接近的拨号码。例如,最接近的33将是331或332 (如果331不存在)...所以必须是33xxxx,34是无效的。
这两个查询可以工作,但速度太慢(250ms/行):
SELECT Dialcode
FROM table
WHERE (Dialcode LIKE '$var%' AND Dialcode > '$var' AND Price IS NOT NULL)
ORDER BY Dialcode ASC LIMIT 1
SELECT Dialcode
FROM table
WHERE (MATCH(Dialcode) AGAINST ('$var*' IN BOOLEAN MODE) AND Dialcode > '$var'
AND Price IS NOT NULL)
ORDER BY Dialcode ASC LIMIT 1我的拨号码是主键BIGINT(15)。
我这样做,它真的很快(>1毫秒/行),但它并不完全是我需要的:
SELECT Dialcode
FROM table
WHERE (Dialcode >= '$var' AND Price IS NOT NULL)
ORDER BY Dialcode ASC LIMIT 1所以我想我的问题是喜欢/匹配。
任何想法都将不胜感激。
更新解决方案:
改编自raina77ow建议的解决方案:
SELECT Dialcode FROM table WHERE (( (Dialcode BETWEEN $var * 1 AND ’9’ )
OR (Dialcode BETWEEN $var * 10 AND $var.’99’ )
OR (Dialcode BETWEEN $var * 100 AND $var.’999’ )
OR (Dialcode BETWEEN $var * 1000 AND $var.’9999’ )
…
) AND Price IS NOT NULL) ORDER BY Dialcode ASC LIMIT 1谢谢你们!
发布于 2012-06-19 06:45:15
我看到这里的主要问题是索引是基于Dialcode的数值构建的,而不是字符串的数值。所以这两个查询根本不使用索引。
你可以尝试构建一个数值型函数,问题是这个函数在计算的左边有Dialcode --所以索引不会再被使用。
也许这种方法可能更有用。
SELECT Dialcode
FROM table
WHERE ( (Dialcode BETWEEN %value% * 10 AND (%value%*10 + 9)
OR (Dialcode BETWEEN %value% * 100 AND (%value%*100 + 99)
OR (Dialcode BETWEEN %value% * 1000 AND (%value%*1000 + 999)
...
) AND Price IS NOT NULL
ORDER BY Dialcode LIMIT 1;它丑陋得要死(我甚至在前两次都写错了--这应该归功于我的改正),是的,但它应该被列入索引。另一种方法是使用UNION (and not OR),但我认为这两个查询将以相同的方式执行(尽管没有进行验证)。
发布于 2012-06-19 07:00:33
尝试使用正则表达式,如下所示:
SELECT Dialcode
FROM table
WHERE Dialcode REGEXP '^[$var]'
ORDER BY Dialcode ASC LIMIT 1我现在不能测试它,但我相信它应该可以工作。
https://stackoverflow.com/questions/11092056
复制相似问题