【问题标题】:Using LIKE to match a string to a string containing multiple words使用 LIKE 将字符串匹配到包含多个单词的字符串
【发布时间】:2010-11-04 01:42:13
【问题描述】:

在 mysql 中,我有一个 WHERE 子句,它使用 LIKE 将关键字与字符串匹配。

WHERE title LIKE CONCAT('%',?,'%')

这几乎可行,但我遇到了一个问题,即包含多个单词的标题返回错误匹配。例如,关键字“press”将匹配标题“depression shits”——这不应该发生。

确保关键字仅在单词开头时才匹配的最佳方法是什么?

感谢(提前)您的帮助

【问题讨论】:

    标签: php sql mysql sql-like


    【解决方案1】:

    字边界标记[[:<:]][[:>:]] 是你的朋友。

    mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]';   -> 1
    mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]';  -> 0
    

    【讨论】:

    • 谢谢 - 不知道你能做到。效果很好!
    【解决方案2】:
    WHERE title LIKE CAT(?, ' %')
    

    % 是通配符,所以如果你在前面和后面都有它,它将查找包含 ? 的任何内容。如果您删除第一个 %,它将是任何以 ? 开头的内容。

    【讨论】:

    • 感谢您的快速回复。这不是我要找的。我想匹配完整的单词。例如,如果我有一个标题“The Quick Brown Fox”和关键字“Brow”——使用上面的代码是行不通的。
    • @Travis:在搜索词和通配符之间放置一个空格是否适合您的需求?
    • @OMG 小马 - 几乎。但这不适用于字符串中的第一个单词。
    【解决方案3】:

    我认为您正在寻找 MATCH 而不是 LIKE。通过适当的索引,MATCH 也更快。

    以下是基本信息:http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

    【讨论】:

    • 我正在使用 innoDB - 全文搜索不可用
    • 哎呀。哦,好吧,看起来 codaddict 为您提供了一个很好的解决方案!
    【解决方案4】:

    不熟悉mysql,但是我在Oracle中使用过REGEXP_LIKE...mysql好像支持类似的东西...

    http://dev.mysql.com/doc/refman/5.1/en/regexp.html

    然后只需编写适当的正则表达式。

    【讨论】:

    • MySQL 中的 REGEXP 确保表扫描 - 不能使用索引
    【解决方案5】:
    WHERE title LIKE CONCAT('% ', ?, '%') OR title LIKE CONCAT(?, '%')
    

    这样,查询将找到关键字,如果它是单词的开头或标题的开头。所以,如果关键字是“猫”,它会找到电影:

    catwoman
    dogs and cats
    

    但不是像这样的电影:

    concatenation
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 2010-12-15
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多