我有一个带有输入框的表单,用户可以在其中指定他们的姓名,名称可以是两个或多个单词,例如 John Smith
或 John Michael Smith
。
我必须编写一个查询,返回包含所显示名称中的所有单词的记录。因此查询将返回具有所有这些单词的名称的记录,但可能具有不同的顺序。
例如,如果搜索字符串为 John Michael Smith
,则查询应该能够返回名称为 Michael John Smith
、Michael 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/