摆脱WHERE子句中的函数

时间:2013-03-02 19:09:38

标签: php mysql sql

我有一个名为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子句中有函数可以防止使用索引并导致性能显着降低。

我可以在不使用WHERE子句中的函数的情况下使用SQL有效地执行此操作,还是应该使用服务器代码(即PHP)来解析给定的搜索短语中的空格和逗号,并根据结果创建动态SQL查询?

2 个答案:

答案 0 :(得分:1)

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

您可以使用LIKE / STRCMP和/或string functions创建一些古怪的查询。如果您采用这种方法,那么编写一些应用程序逻辑来内联创建查询会更好,而不是尝试编写一个可以处理所有内容的查询。无论哪种方式,它都不可能真正有效

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

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

答案 1 :(得分:0)

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