我找不到足够接近我要问的问题,所以这是我的问题:
我有一个存储在MySQL表中的列入黑名单的单词列表。然后我有一个句子。我需要构建一个MySQL查询,在那里我搜索句子中任何列入黑名单的单词的出现。
如果只有一个匹配,搜索可能会停止,因为句子不可接受。
有人可以帮我构建这个查询吗?谢谢!
如果可能的话,我想避免在PHP和MySQL之间跳转。我可以有两千个或更多的黑名单。我想将我的文件作为字符串/变量提交到MySql中,而不是从中构建表。
我得到的最接近的一行是:
SELECT keyword, STRCMP('this is my sentence with blacklisted word', keyword) FROM blacklist;
也许,我的路线方向很好,可以改进,如果找到匹配则只返回TRUE或FALSE?
答案 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 WHERE
和LIKE
:
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.您会注意到,这会检查任何带有“黑名单”或“此”字样的句子。应该返回四行。