如何找到完全匹配全部或部分输入的字符串

li9yvcax  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(341)

我想写一个查询来搜索一个包含数百万条记录的表,寻找一个完全匹配搜索字符串或其子字符串的值。表现是最重要的。
就像一个反面:

SELECT * FROM table_name WHERE column_name LIKE '$input%' LIMIT 1

例如,我想在下表中搜索foobar。如果foobar不存在,则搜索fooba直到最后一个字符f,并返回完全匹配的行。

+------------------+
|    column_name   |
+------------------+
|    foobar        |
+------------------+
|    fooba         |
+------------------+
|    foob          |
+------------------+
|    foo           |
+------------------+
|    fo            |
+------------------+
|    foobarrrrr    |
+------------------+
|    foooooooooooo |
+------------------+
|    barfoo        |
+------------------+
flmtquvp

flmtquvp1#

我不认为有一个真正的性能方法,但下面可能会做你想要的。
首先,在上创建索引 t(column_name) .
然后,将查询构造为:

select t.*
from ((select t.* from table_name where column_name = $input) union all
      (select t.* from table_name where column_name = left($input, 1)) union all
      (select t.* from table_name where column_name = left($input, 2)) union all
      (select t.* from table_name where column_name = left($input, 3)) union all
      (select t.* from table_name where column_name = left($input, 4)) union all
      . . .
     ) t
order by length(t.column_name) desc
limit 1;

笔记:
这是循环通过的前缀 $input 有不同的长度。您可以使用php实现这一点,并在第一次匹配时停止。
上的索引 column_name 应用于比较。
这只适用于精确的子串匹配(我就是这样解释这个问题的)。

daolsyd0

daolsyd02#

可以使用列值来构造 LIKE 动态模式。

SELECT column_name
FROM table_name
WHERE 'foobar' LIKE CONCAT(column_name, '%')
ORDER BY LENGTH(column_name) DESC
LIMIT 1

请注意,如果表很大,这将很慢,因为我认为它不能使用索引。如果这是个问题,那么动态构建查询会更好。

相关问题