【问题标题】:Search across multiple columns跨多个列搜索
【发布时间】:2013-08-29 09:50:45
【问题描述】:

我正在使用这个 Mysql 查询:

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

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

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

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

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

【问题讨论】:

  • 你的表是 InnoDB 吗?
  • 为什么这会让您感到疑惑?您查询了一个字符串bill new york,但没有一列包含该字符串。您得到了new york 的结果,因为一列恰好 包含该字符串。没有正确的方法,有一种方法可以为您提供数据,而另一种方法则不能。使用LIKE 进行搜索很糟糕,因为它不仅速度慢 - 正如您所经历的那样,它很难正确实施。 Google 关于使用 FULLTEXT 索引和搜索(它与 InnoDB 存储引擎一起使用)来查看人们如何在多个列中搜索多个单词。
  • @mihai 是的 InnoDB 是
  • 你的mysql版本是多少?
  • @米海服务器版本:5.5.31

标签: php mysql sql


【解决方案1】:

当您在针对列的语句中使用 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

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

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    您使用 FULLTEXT 索引。

    我建议后者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-24
      • 2016-07-07
      • 2019-03-07
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      相关资源
      最近更新 更多