我在SQL中定义了一个函数来计算两个给定字符串之间的Levenshtein距离。
目前我以类似下面的方式调用此函数:
SELECT * FROM movies M WHERE levenshtein ( M.title, "Foobar" ) < 5;
我想按照levenshtein距离的升序使用结果,但不知道这样做的正确方法。
有没有办法做到这一点,还是我必须以不同的方式做到这一点?
答案 0 :(得分:2)
levenshtein()
是一项昂贵的功能。如果性能完全相关,您可能希望避免两次调用它。使用子选择。 (在其他RDBMS中,您可能使用CTE,但MySQL没有。)
运行测试以查看哪个表现更好。
SELECT some_col
FROM (SELECT some_col, levenshtein(title, 'Foobar') AS levi FROM movies) AS m
WHERE levi < 5
ORDER BY levi;
BTW,你不想把表别名放在SELECT列表中,就像你的例子一样,是吗?
答案 1 :(得分:0)
ORDER BY levenshtein ( M.title, "Foobar" )
答案 2 :(得分:0)
我相信您可以在order by子句中重用该函数,如下所示:
SELECT *
FROM movies M
WHERE levenshtein ( M.title, "Foobar" ) < 5
ORDER BY levenshtein ( M.title, "Foobar" );
另一个选项是将所有记录的结果(通过添加函数调用列)输出到临时表,然后使用WHERE
和ORDER BY
子句从中选择在有问题的栏目上。
答案 3 :(得分:0)
对于寻找类似答案的人,我对同一类问题有一些实际经验。
虽然效果很好,但问题是......
ORDER BY levenshtein ( M.title, "Foobar" )
...并不是它执行两次函数(从对500,000行表进行测试,我不相信它),但查询使用filesort来执行ORDER BY。您可能知道,在WHERE子句中合并ORDERed列不需要filesort。问题是ORDERed值不是列,并且不像纯列引用那样工作。