php - SQL:查询搜索所有可能的单词

标签 php mysql sql

我有一个带有输入框的表单,用户可以在其中指定他们的姓名,名称可以是两个或多个单词,例如 John SmithJohn Michael Smith

我必须编写一个查询,返回包含所显示名称中的所有单词的记录。因此查询将返回具有所有这些单词的名称的记录,但可能具有不同的顺序。

例如,如果搜索字符串为 John Michael Smith,则查询应该能够返回名称为 Michael John SmithMichael Smith John 的记录John Smith Michael 或所有这些词的组合。可以看出,仅返回名称字段中仍包含所有单词的记录,但可能具有不同的顺序。但是,它应该返回不包含部分名称的结果,例如,不应返回 John Michael,因为其中没有 Smith

我尝试过这样的查询:

SELECT id, name FROM users WHERE
     name LIKE '%Michael%' &&
     name LIKE '%Smith%' &&
     name LIKE '%John%'

同样的问题发生在:

SELECT * FROM users WHERE MATCH (name)
    AGAINST ('+Michael +Smith +John' IN BOOLEAN MODE);

这两个查询还返回 John Michael,而不是包含所有三个单词的记录:(

我不知道如何编写一个符合要求的查询,这样我就可以了。请帮忙。

最佳答案

使用 fulltext index 。这是最简单/最快的方法。否则,您将陷入解析搜索字符串、转换

John Michael Smith

进入

SELECT ... WHERE (name LIKE '%John%') OR (name LIKE '%Michael%') OR (name LIKE '%Smith%')

这很快就会变得很痛苦,而且执行起来非常慢,因为 LIKE %..% 搜索无法使用索引。

请注意,全文索引目前仅限于 MyISAM 表,因此如果您使用 InnoDB,则必须使用解决方法(MyISAM 格式的并行表来保存可搜索数据,并使用触发器来保持两个副本同步)。显然,InnoDB 的全文最终已进入开发流程,但尚未实现。

关于php - SQL:查询搜索所有可能的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7757437/

相关文章:

python - 动态计算一年中每周前 3 周的值

php - 从 Wamp 文件夹恢复 MySQL 数据库

sql - 尝试通过Spark Streaming运行SparkSQL

php - 显示每个用户的三张图片

php - 向 Wordpress 中现有的 WP_Query 添加条件

php - MacGDBp,但更好?

php - 将数组转换为字符串,然后返回 PHP

python - 接近原始文本输入的良好哈希算法,较少的雪崩效应?

php - 如何发布其中包含数据库内容的复选框值? PHP MYSQL

java - 在 sql java for android 中向表中添加一列