1

我有一个名为的表users,其中包含列firstnamelastname.

我正在努力研究如何构造 WHERE 子句以返回匹配的名字、姓氏、名字加上空格和姓氏以及姓氏加上逗号和名字的结果。例如,“John”、“Doe”、“John Doe”和“Doe, John”。它也应该适用于部分补丁(即“John D”)。我正在考虑类似以下的内容(用搜索短语替换 ? )。

SELECT * FROM people WHERE
firstname LIKE ?
OR CONCAT_WS(" ",firstname,lastname) LIKE ?
OR lastname LIKE ?
OR CONCAT_WS(", ",lastname,firstname) LIKE ?

这种方法有一个小缺陷,因为搜索“John Doe”也会返回“John Enders”、“John Flaggens”和“John Goodmen”,所以我需要添加一些条件来在第一个和当两者都给出时,姓氏匹配。

这种方法还有一个很大的缺陷,因为我的 WHERE 子句中有一些函数可以防止使用索引并导致性能显着降低。

我可以只使用 SQL 有效地做到这一点,而无需在 WHERE 子句中使用函数,还是应该使用服务器代码(即 PHP)来解析给定的搜索短语中的空格和逗号并根据结果创建动态 SQL 查询?

4

2 回答 2

1

您问是否可以在 MySQL 中有效地执行此操作,考虑到您的架构设计而不使用FULLTEXT搜索,简单的答案是否定的,您无法有效地执行此操作。

您可以使用LIKE/STRCMP和/或字符串函数创建一些古怪的查询。如果您采用这种方法,最好编写一些应用程序逻辑来创建内联查询,而不是尝试编写一个可以处理所有事情的查询。无论哪种方式,它都不太可能真正有效

MySQL 5.6 能够在 INNODB中执行FULLTEXT搜索。如果您使用的是较低版本,则只能使用 MyISAM 表执行此操作——MyISAM 可能不是一个好主意的原因有很多。

另一种方法是查看真正的搜索解决方案,例如LuceneSphinxXapian

于 2013-03-02T19:38:11.930 回答
0

您是否尝试过正则表达式http://dev.mysql.com/doc/refman/5.1/en/regexp.html

于 2013-03-02T20:06:19.267 回答