【发布时间】:2010-11-04 01:42:13
【问题描述】:
在 mysql 中,我有一个 WHERE 子句,它使用 LIKE 将关键字与字符串匹配。
WHERE title LIKE CONCAT('%',?,'%')
这几乎可行,但我遇到了一个问题,即包含多个单词的标题返回错误匹配。例如,关键字“press”将匹配标题“depression shits”——这不应该发生。
确保关键字仅在单词开头时才匹配的最佳方法是什么?
感谢(提前)您的帮助
【问题讨论】:
在 mysql 中,我有一个 WHERE 子句,它使用 LIKE 将关键字与字符串匹配。
WHERE title LIKE CONCAT('%',?,'%')
这几乎可行,但我遇到了一个问题,即包含多个单词的标题返回错误匹配。例如,关键字“press”将匹配标题“depression shits”——这不应该发生。
确保关键字仅在单词开头时才匹配的最佳方法是什么?
感谢(提前)您的帮助
【问题讨论】:
字边界标记[[:<:]]、[[:>:]] 是你的朋友。
mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]'; -> 1
mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]'; -> 0
【讨论】:
WHERE title LIKE CAT(?, ' %')
% 是通配符,所以如果你在前面和后面都有它,它将查找包含 ? 的任何内容。如果您删除第一个 %,它将是任何以 ? 开头的内容。
【讨论】:
我认为您正在寻找 MATCH 而不是 LIKE。通过适当的索引,MATCH 也更快。
以下是基本信息:http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html
【讨论】:
不熟悉mysql,但是我在Oracle中使用过REGEXP_LIKE...mysql好像支持类似的东西...
http://dev.mysql.com/doc/refman/5.1/en/regexp.html
然后只需编写适当的正则表达式。
【讨论】:
WHERE title LIKE CONCAT('% ', ?, '%') OR title LIKE CONCAT(?, '%')
这样,查询将找到关键字,如果它是单词的开头或标题的开头。所以,如果关键字是“猫”,它会找到电影:
catwoman
dogs and cats
但不是像这样的电影:
concatenation
【讨论】: