2

我正在使用这个 Mysql 查询:

WHERE fname LIKE '%{$query}%' OR lname LIKE '%{$query}%' OR zipcode LIKE '%{$query}%' OR city LIKE '%{$query}%'

假设我的数据库中有以下信息:

  • 名字:比尔
  • 姓名:盖茨
  • 邮编:12345 AA
  • 城市:纽约

当我搜索“纽约”时,我得到了预期的结果(比尔盖茨),但是当我搜索“比尔纽约”时,我没有得到任何结果。

跨多列搜索的正确查询是什么?

4

3 回答 3

3

在您的语句中对列使用 LIKE 时,您是说将所有“bill new york”与“New York”城市进行比较,这将失败,因为“bill”一词在查询中而不是在列中。

在这种情况下,您最好使用 MySQL 的 FULLTEXT 搜索,如下所示;

SELECT FieldName, 
MATCH (FieldName) AGAINST (+"Bill New York" IN BOOLEAN MODE) AS Relevance
FROM MyTable
WHERE MATCH (FieldName) AGAINST (+"Bill New York" IN BOOLEAN MODE) 
HAVING Relevance > 0
ORDER BY Relevance DESC

如果您可以提供表结构,我可以扩展答案。

于 2013-08-29T09:58:27.300 回答
0

您遇到的问题是 LIKE 基本上只是 = 的不区分大小写版本

有两种方法可以去做你想做的事情,第一个方法是在 saces 上爆炸你的 r $query 并为每个找到的工作使用一系列 LIKE,这很混乱,我不建议这样做。

第二个更可取的选择是使用全文搜索 MATCH() AGAINST() 它更简单,代码更简洁 http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural- language.html <- 这是一个很好的起点

于 2013-08-29T09:57:49.657 回答
0

您要么需要将查询解析为单独的单词并动态构造一个 looooong WHERE 子句,该子句分别搜索每个字段的每个单词,或者将它们组合在一起。

或者

您使用 FULLTEXT 索引。

我建议后者。

于 2013-08-29T09:59:06.950 回答