【问题标题】:Searching for keywords in two MySQL columns在两个 MySQL 列中搜索关键字
【发布时间】:2011-01-12 10:53:23
【问题描述】:

我有一个用户表,其中包含名为 first_namelast_name 的列。

SELECT * 
    FROM users 
WHERE first_name LIKE '%keywords%' 
    OR last_name LIKE '%keywords%'

使用上述方法,如果我搜索“John”或“Doe”,我会获得成功。

但如果我搜索“John Doe”,我会得到 0 个结果。如何以匹配“first_name last_name”而不是仅匹配一个或另一个的方式搜索 MySQL?

【问题讨论】:

  • 您是否仅限于使用一个变量?
  • 变量是从搜索字段输入的,所以它可能只有一个词,也可能是两个(名字和姓氏)。

标签: sql mysql


【解决方案1】:

一种解决方案是在您的应用程序中拆分关键字,然后按如下方式构建查询:

-- Split "John Doe" -> "John", "Doe"

SELECT * FROM users WHERE
(
    (
         first_name LIKE '%keyword_1%' OR
         last_name LIKE '%keyword_1%'
    )
    AND
    (
         first_name LIKE '%keyword_2%' OR
         last_name LIKE '%keyword_2%'
    )
)

上述内容也将匹配“Doe Joe”,而不仅仅是“Joe Doe”。如果您要搜索更多列,这将变得更大,因为您必须为每个关键字添加一个“AND 块”。

此外,这会带来很大的性能成本,因为这样的查询无法使用first_namelast_name 上的索引(如果有的话)。更好的方法是使用Full Text indexing

【讨论】:

    【解决方案2】:

    试试:

    SELECT * FROM users WHERE CONCAT(first_name, ' ', last_name) LIKE '%keywords%';
    

    【讨论】:

    • 很好,但如果存在用于first_namelast_name 列的索引,除了在左侧使用带有通配符的LIKE 之外,将无法使用索引。跨度>
    【解决方案3】:

    您是否尝试过使用full-text indexing

    【讨论】:

    • Ehm - 为什么你提供完全相同的链接@Daniel Vassallo 可能比你的答案高出 4 厘米(如果你按最旧排序,如果你按最新排序的话会更远一点)?
    • 我想我一定错过了,在@Daniel Vassallo 以完全不同的方式开始回答之后。
    猜你喜欢
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多