搜索句子中任何存储的单词的出现(MySQL)

时间:2014-10-25 18:48:14

标签: php mysql

我找不到足够接近我要问的问题,所以这是我的问题:

我有一个存储在MySQL表中的列入黑名单的单词列表。然后我有一个句子。我需要构建一个MySQL查询,在那里我搜索句子中任何列入黑名单的单词的出现。

如果只有一个匹配,搜索可能会停止,因为句子不可接受。

有人可以帮我构建这个查询吗?谢谢!

修改

如果可能的话,我想避免在PHP和MySQL之间跳转。我可以有两千个或更多的黑名单。我想将我的文件作为字符串/变量提交到MySql中,而不是从中构建表。

我得到的最接近的一行是: SELECT keyword, STRCMP('this is my sentence with blacklisted word', keyword) FROM blacklist;

也许,我的路线方向很好,可以改进,如果找到匹配则只返回TRUE或FALSE?

6 个答案:

答案 0 :(得分:1)

假设您有一个包含所有列入黑名单的单词的表格,您可以在php中构建一个单词列表,并将其作为参数传递给where子句查询。

  $words = str_word_count($string, 1);
  $whereclause = join("','",$words);
  $whereclause  = "('".$whereclause."')";

  $query = "Select COUNT(words) from blacklisttable where words IN".$whereclause;

然后你可以检查结果是否等于零。

答案 1 :(得分:1)

如果您的表格中包含in中包含的任何字词,则必须将您的句子分解为单词。如果你使用php,你可以这样做:

  $expression="is there any blacklisted word here";
  $words=str_word_count($expression, 1);
  $words=implode(",",$words);
  $sql=mysql_query("select word from table_black_list_word where word in ($words)",$db_conn);
 if($row=mysql_fetch_array($sql)){
   //case your expression do have a blacklisted word
   }else{
     //expression does not contains any blacklisted word

   }

答案 2 :(得分:1)

如何使用mysql WHERELIKE

WHERE
  (
       `sentence` LIKE '%blist1%'
    OR `sentence` LIKE '%blist2%'
    OR `sentence` LIKE '%blist3%'
    OR `sentence` LIKE '%blist4%'
  )

现在使用php,您可以通过。

生成来自黑名单数组的where语句
$whereStatement = "";
$blackList = new Array('blist1','blist2','blist3','blist4');
$len=count($blackList);
for($i=0;$i<$len-2;$i++) {
$whereStatement+="sentence LIKE '%$blackList[$i]' ";
}
$whereStatement+="sentence LIKE '%$blackList[$len-1]' ";
$query = "(WHERE $whereStatement )";

答案 3 :(得分:0)

经过大量的实验,我找到了自己问题的答案:

SELECT SUM( 'this is my windows xp file' LIKE CONCAT('%', keyword, '%')) AS result FROM blacklist;

不需要多次查询或预处理PHP中的任何内容或MySQL和PHP之间的多次跳转。

答案 4 :(得分:0)

你可以使用locate函数来实现:

SELECT * FROM blacklist WHERE locate(keyword, 'the sentence') > 0

答案 5 :(得分:-2)

要在句子中搜索表达式,您只需在列入黑名单的单词之前和之后使用通配符即可。假设您的句子全部在一列中,您可以在where子句中对其进行过滤。

试试这个:

SELECT *
FROM myTable
WHERE sentenceColumn LIKE '%blacklistedWord%'

SQLFiddle示例。

修改

对不起OP,但我以为我误解了你的问题。我现在看到你想在一个句子中寻找任意数量的黑名单。

以下查询根据句子中是否有一个列入黑名单的单词来拉取所有句子。然而,该查询将拉出匹配的每次出现。换句话说,如果一个句子有三个列入黑名单的单词,将返回三行。要纠正这个问题,您可以按句子(或句子ID,与表格匹配)进行分组。

SELECT sentences.*
FROM sentences
JOIN blacklisted ON sentences.sentence LIKE CONCAT('%', blacklisted.word, '%')
GROUP BY id;

这是更新后的SQL fiddle.您会注意到,这会检查任何带有“黑名单”或“此”字样的句子。应该返回四行。