我正在尝试在名称为人的sql表上进行“模糊”搜索:
这是表格:
+----+------------+
| T1 | T2 |
+----+------------+
| 1 | Last,First |
| 2 | Last,First |
| 3 | Last,First |
+----+------------+
我想获得一个select语句,我在其中使用 T2
运算符查询LIKE
,这样即使您的查询“First Last”< /强>
我能想到的唯一方法是拆分值并连接它们然后再次搜索条目。有更好的方法吗?
答案 0 :(得分:5)
是的,如果有可能将last, first
和first 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%'
这样,你就不那么关心订单了。
然而,鉴于我不喜欢慢查询,除非绝对必要(或者你的数据库相对较小且可能保持这种状态),否则我会尽量避开它。
有各种方法可以加速这些类型的查询,例如:
last, first
表单进行搜索。%something%
搜索字符串(使用something%
,仍然可以使用索引)。答案 1 :(得分:1)
你可以尝试这个。但最好通过分隔名称来重构表格的模式。
SELECT *
FROM myTable
WHERE T2 LIKE CONCAT('%', 'First', '%','Last', '%') OR
T2 LIKE CONCAT('%', 'Last', '%','First', '%')