在MySQL(InnoDB)中找到最匹配的行

sam*_*lux 9 regex mysql

我有以下测试字符串engine/mail/key和一个如下所示的表:

+-------------+
| query       |
+-------------+
| engine      |
| engine/pdf  |
| engine/mail |
+-------------+
Run Code Online (Sandbox Code Playgroud)

我想找到最匹配的行.最佳匹配由字符串/行开头的最匹配字符指定.

我已经构建了一个RegExp,但它当然匹配所有行,并且不会给我任何与大多数字符/部分相匹配的信息.
正则表达式:^engine(/mail(/key)?)?

关于使用MySQL的FIND_IN_SET函数,我有另一个想法:

`FIND_IN_SET(query,'engine,engine/mail,engine/mail/key')`
Run Code Online (Sandbox Code Playgroud)

并通过它的输出来排序结果.

这可行,但它绝不是一个很好的解决方案.有没有人对此有更好的了解?

a'r*_*a'r 9

只是使用LIKE,但另一种方式是你可能习惯的.

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

结果:

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)
Run Code Online (Sandbox Code Playgroud)