在mysql中,我有一个WHERE子句,它使用LIKE将关键字与字符串匹配。
WHERE title LIKE CONCAT('%',?,'%')
这几乎可行,但我遇到了一个问题,即有多个单词的标题会返回错误的匹配。例如,关键字“press”将与标题“抑郁糟透”相匹配 - 这不应该发生。
确保关键字仅在单词的开头处匹配时,最好的方法是什么?
先谢谢你的帮助
答案 0 :(得分:4)
单词边界标记[[:<:]]
,[[:>:]]
是您的朋友。
mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]'; -> 1
mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]'; -> 0
答案 1 :(得分:1)
WHERE title LIKE CAT(?, ' %')
%是通配符,所以如果你在前面和后面都有它,它会查找包含?的任何内容。如果你删除第一个%,它将是以?
开头的任何内容答案 2 :(得分:1)
我认为您正在寻找MATCH
而不是LIKE
。通过适当的索引,MATCH
也会更快。
以下是基础知识:http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html
答案 3 :(得分:0)
不熟悉mysql,但我在Oracle中使用了REGEXP_LIKE ... mysql似乎支持类似的东西......
http://dev.mysql.com/doc/refman/5.1/en/regexp.html
然后编写相应的正则表达式。
答案 4 :(得分:0)
WHERE title LIKE CONCAT('% ', ?, '%') OR title LIKE CONCAT(?, '%')
这样,查询将找到关键字,如果它是单词的开头或标题的开头。所以,如果关键字是'cat',它会找到电影:
catwoman
dogs and cats
但不是像以下那样的电影:
concatenation