逗号分隔名称的MySQL搜索查询

Kar*_*tik 1 mysql

我试图在一个名为people的sql表上进行"模糊"搜索:

这是表:

+----+------------+
| T1 | T2         |
+----+------------+
| 1  | Last,First |
| 2  | Last,First |
| 3  | Last,First |
+----+------------+
Run Code Online (Sandbox Code Playgroud)

我希望得到一个select语句,我查询T2LIKE操作,使得它的工作原理,甚至当你的查询是"第一个最后"

我能想到的唯一方法是拆分值并连接它们然后再次搜索条目.有一个更好的方法吗?

pax*_*blo 5

是的,如果有一个可能性,你可以将两者last, firstfirst last存入数据库,更好的方式是正确的设计架构.

如果你曾经发现自己想搜索的,或以其他方式操纵,部分栏目,您的模式几乎可以肯定是坏.它几乎肯定会扼杀性能.

正确的方法是使表格如此:

T1  FirstName  LastName
==  =========  ========
 1  Pax        Diablo
 2  Bob        Smith
 3  George     Jones
Run Code Online (Sandbox Code Playgroud)

然后,您可以更有效地拆分用户输入的名称(一次,在运行查询之前),而不是尝试拆分数据库中的每个名称.


数据库始终保持的情况下,last, first实际上可能不需要更改模式.

在这种情况下,您遇到的问题只是解释用户输入的内容.

一种可能性虽然是性能杀手,但却是like为每个单独的词做一个.因此,如果用户输入pax diablo,您的结果查询可能是:

select T1 from mytable
    where T2 like '%pax%'
      and T2 like '%diablo%'
Run Code Online (Sandbox Code Playgroud)

这样,你就不那么关心订单了.

但是,由于我不喜欢慢查询,除非绝对必要(或者你的数据库相对较小并且可能保持这种状态),否则我会尽量避开它.

有各种方法可以加速这些类型的查询,例如:

  • 使用DBMS具有的任何全文搜索功能.
  • 通过在插入/更新触发期间提取和存储单词来模拟这些能力(并在删除触发期间删除它们).
  • 在前一种情况下,还要确保使用当前列的较低值(用于速度)的额外列.
  • 告诉用户他们需要使用last, first表单进行搜索.
  • 试图尽可能避免%something%搜索字符串(something%仍然可以使用索引).
  • 我之前提到的"将名称分成两列"的方法.