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

Php 搜索句子中存储的任何单词(MySQL),php,mysql,Php,Mysql,我无法找到一个与我所问问题足够接近的问题,因此我的问题是: 我有一个存储在MySQL表中的黑名单单词列表。然后我有一句话。我需要构造一个MySQL查询,在这里搜索句子中出现的任何被列入黑名单的单词 如果只有一个匹配项,搜索可能会停止,因为该句子不可接受 有人能帮我构造这个查询吗?谢谢 编辑 如果可能的话,我希望避免在PHP和MySQL之间跳转。我可以有两千个或更多被列入黑名单的单词。我想将我的文件作为字符串/变量提交到MySql中,而不是从中构建表 我得到的最接近的一行SQL是: 从黑名单中选择

我无法找到一个与我所问问题足够接近的问题,因此我的问题是:

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

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

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

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

我得到的最接近的一行SQL是:
从黑名单中选择关键字,STRCMP('这是我用黑名单字写的句子',关键字)


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

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

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

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

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

您必须使用
中的
将您的句子拆分为单词,检查您的表格是否包含这些单词。如果您使用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

   }

如何使用mysql
WHERE
和类似的

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 )";
$whereStatement=”“;
$blackList=新数组('blist1'、'blist2'、'blist3'、'blist4');
$len=计数($blackList);

对于($i=0;$i要搜索句子中的表达式,您只需在黑名单单词前后使用通配符即可。假设您的句子都在一列中,您可以在where子句中进行筛选

试试这个:

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

编辑

很抱歉,我以为我误读了你的问题。我现在明白了,你想在一个句子中查找任何数量的黑名单单词

下面的查询根据句子中是否有一个列入黑名单的单词来提取所有句子。但是,此查询将提取匹配项的每次出现。换句话说,如果一个句子有三个列入黑名单的单词,将返回三行。要更正此问题,可以按句子分组(或句子id,与表格匹配的任何内容)


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

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

选择SUM('这是我的windows xp文件',如CONCAT('%',关键字'%'))作为黑名单的结果;


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

您可以使用locate函数:

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

你的句子在哪里?@MyDog:hi,这个句子是作为参数传递到查询中的。这个句子正在变化,它是从PHP脚本传递过来的。我需要检查它是否包含任何黑名单上的单词。OP,我第一次误读了这个问题。我现在知道你可能有多个黑名单上的单词,所以我更新了我的答案它。这不是用PHP标记的,我不熟悉PHP,但看看我编辑过的答案,它显示了假设你的句子存储在一个表中,而不是作为引用传递,你可以如何做到这一点。这可能仍然有帮助。@McAdam331:嗨,谢谢你的更新。是的,你做得很好。因为速度的原因,我想避免使用ju在PHP和MySQL之间进行mping。我想构建一个查询并获得结果。我需要一段时间来消化您的示例,但我知道,我想在查询中提交一个字符串作为变量。好的,希望您能解决它。我建议在您的问题中添加PHP标记,并编辑问题以说明您正在使用PHP。这很有帮助像我这样的人,他的答案对于MySQL来说是正确的(因为它被标记了),但并没有真正回答你的问题。但是使用“like”并不是一个好的解决方案例如:如果你的表“blacklist”包含关键字“facebook”作为一个黑名单单词,那么包含单词“face”的表达式将被拒绝
SELECT * FROM blacklist WHERE locate(keyword, 'the sentence') > 0