在MySQL(InnoDB)中查找最佳匹配行

10
我有以下测试字符串engine/mail/key和一个如下所示的表格:
+-------------+
| query       |
+-------------+
| engine      |
| engine/pdf  |
| engine/mail |
+-------------+
我想找到最匹配的行。最佳匹配是指从字符串/行的开头开始最匹配的字符。 我已经构建了一个RegExp,但它当然会匹配所有行,并且不会告诉我哪个匹配了最多的字符/部分。
正则表达式:^engine(/mail(/key)?)? 我有另一个想法,可以使用MySQL的FIND_IN_SET函数,像这样:
`FIND_IN_SET(query,'engine,engine/mail,engine/mail/key')`

并按其输出结果排序。

这样做是可行的,但并不是一个好的解决方案。有没有更好的想法呢?

1个回答

10

只需要使用LIKE,但与您通常使用的方式相反。

select query
from table1
where 'engine/mail/key' like concat(query,'%')
order by length(query) desc
limit 1

结果:

mysql> select * from query;
+-------------+
| query       |
+-------------+
| engine      | 
| engine/pdf  | 
| engine/mail | 
+-------------+
3 rows in set (0.00 sec)

mysql> select query from query 
       where 'engine/mail/key' like concat(query,'%') 
       order by length(query) desc 
       limit 1;
+-------------+
| query       |
+-------------+
| engine/mail | 
+-------------+
1 row in set (0.01 sec)

1
这不匹配任何内容。而且按 LENGTH(query) 排序是不够的,因为可能会有一行像 engine/website 的内容,那么它将被选择而不是 engine/mail - samy-delux
抱歉,我已经更正了查询语句,现在应该可以运行了。请尝试一下,看看是否得到了您期望的结果。 - a'r
谢谢这个,比“FIND_IN_SET” hack好多了!像这样反过来使用“LIKE”真的是一个很棒的技巧! - samy-delux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接