Найти наиболее подходящую строку в MySQL (InnoDB) - PullRequest
9 голосов
/ 02 марта 2010

У меня есть следующая тестовая строка engine/mail/key и таблица, которая выглядит следующим образом:

+-------------+
| query       |
+-------------+
| engine      |
| engine/pdf  |
| engine/mail |
+-------------+

Я хочу найти самую подходящую строку. Наилучшее совпадение определяется наиболее подходящими символами в начале строки / строки.

Я создал RegExp, но он, конечно, соответствует всем строкам и не даст мне никакой информации о том, какие из них соответствуют большинству символов / частей. Регулярное выражение: ^engine(/mail(/key)?)?

У меня была другая идея об использовании функции FIND_IN_SET MySQL, подобной этой:

`FIND_IN_SET(query,'engine,engine/mail,engine/mail/key')`

И упорядочить результат по его выводу.

Это бы сработало, но это ни в коем случае не хорошее решение. У кого-нибудь есть идеи по этому поводу?

1 Ответ

9 голосов
/ 02 марта 2010

Просто используйте 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...