【问题标题】:Search for occurence of any stored words within a sentence (MySQL)搜索句子中任何存储单词的出现(MySQL)
【发布时间】:2014-12-21 08:33:14
【问题描述】:

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

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

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

谁能帮我构建这个查询?谢谢!

编辑

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

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

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

【问题讨论】:

  • 你的句子在哪里?
  • @MyDog:嗨,这句话作为参数传递到查询中。句子正在改变,它是从 PHP 脚本传递的。我需要检查它是否包含任何列入黑名单的单词。
  • OP,我第一次看错了这个问题。我现在看到您可能有多个列入黑名单的单词,所以我稍微更新了我的答案。这没有用我不熟悉的 PHP 标记,但请查看我编辑的答案,该答案显示了假设您的句子存储在表格中而不是作为参考传递的情况下如何做到这一点。它可能仍然有帮助。
  • @McAdam331:您好,感谢您的更新。是的,你在一个很好的方式。由于速度的原因,我想避免在 PHP 和 MySQL 之间跳转。我想构建一个查询并获得结果。我需要一段时间来消化你的例子,但我知道,我想将一个字符串作为变量提交到查询中。
  • 好的,希望你能解决。我建议将 php 标签添加到您的问题中,并编辑问题以说明您正在使用 PHP。它可以帮助像我这样的人,他们的答案对于 MySQL 来说是正确的(因为它被标记了),但并没有真正回答你的问题。

标签: php mysql


【解决方案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】:

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

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

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

    【讨论】:

      【解决方案3】:

      使用mysqlWHERELIKE怎么样:

      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 )";
      

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 但是使用 'Like' 并不是一个好的解决方案,例如:如果您的表“blacklist”包含关键字“facebook”作为列入黑名单的单词,则包含单词“face”的表达式将被拒绝
        【解决方案5】:

        你可以用定位功能做到这一点:

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

        【讨论】:

          【解决方案6】:

          要在句子中搜索表达式,您可以在列入黑名单的单词前后使用通配符。假设您的句子都在一列中,您可以在 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.@您会注意到它会检查任何带有“列入黑名单”或“此”字样的句子。应该返回四行。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-22
            • 1970-01-01
            • 1970-01-01
            • 2019-07-09
            • 1970-01-01
            相关资源
            最近更新 更多