php - 去掉 WHERE 子句中的函数

标签 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 子句中有函数阻止使用索引并导致性能显着降低。

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

最佳答案

你问是否可以在 MySQL 中高效执行此操作,考虑到你的模式设计而不使用 FULLTEXT搜索简单的答案是否定的,你不能有效地做到这一点。

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

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

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

关于php - 去掉 WHERE 子句中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15178270/

相关文章:

javascript - 我应该如何使用 html、jQuery 构建一个控件数组

php - 使用 PHP 读取文本文件并显示特定字符​​串后的所有文本

java - 我应该为读语句使用哪种事务隔离级别?

SQL将十六进制格式的字符串数据转换成字符串文本

mysql - mysql中的sum函数和count函数

php - 为什么 hasFile() 方法返回 false?

mysql - 如何进行条件计数

php - 如何使用 mysql 在 android 中更改密码(注册和登录工作正常,但更改密码时出现问题)

python - 如何从连接 URI 中的 SQL 密码转义 `@` 字母

javascript - 国家代码后面的0怎么去掉