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


Search for occurence of any stored words within a sentence (MySQL)

我找不到一个与我所问的问题足够接近的问题,所以我的问题是:

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

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

有人能帮我构造这个查询吗?谢谢

编辑

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

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

也许,我的行朝着一个好的方向发展,如果找到匹配,可以改进为简单地返回TRUE或FALSE?

您必须使用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
   }

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

  $words = str_word_count($string, 1);
  $whereclause = join("','",$words);
  $whereclause  = "('".$whereclause."')";
  $query = "Select COUNT(words) from blacklisttable where words IN".$whereclause;

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

如何使用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 )";

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

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

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

您可以使用定位功能:

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

要搜索句子中的表达式,只需在列入黑名单的单词前后使用通配符即可。假设你的句子都在一列中,你可以在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。你会注意到,这会检查任何带有"黑名单"或"这个"的句子。应返回四行。