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

时间:2012-08-14 02:57:48

标签: mysql

我正在尝试在名称为人的sql表上进行“模糊”搜索:

这是表格:

+----+------------+
| T1 | T2         |
+----+------------+
| 1  | Last,First |
| 2  | Last,First |
| 3  | Last,First |
+----+------------+

我想获得一个select语句,我在其中使用 T2 运算符查询LIKE,这样即使您的查询“First Last”< /强>

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

2 个答案:

答案 0 :(得分:5)

是的,如果有可能将last, firstfirst last放入数据库,则更好的方法是正确设计架构。

如果您发现自己试图搜索或操纵部分列,那么您的架构几乎肯定会被破坏。它几乎肯定会扼杀性能。

正确的方法就是拥有这样的表格:

T1  FirstName  LastName
==  =========  ========
 1  Pax        Diablo
 2  Bob        Smith
 3  George     Jones

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


如果数据库始终包含last, first,则实际上可能不需要更改架构。

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

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

select T1 from mytable
    where T2 like '%pax%'
      and T2 like '%diablo%'

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

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

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

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

答案 1 :(得分:1)

你可以尝试这个。但最好通过分隔名称来重构表格的模式。

SELECT *
FROM myTable
WHERE T2 LIKE CONCAT('%', 'First', '%','Last', '%') OR
      T2 LIKE CONCAT('%', 'Last', '%','First', '%')