我在表格中有以下数据
id Description Category
1 I am Desc with printer main category
2 I am desc with test test category
3 new printer desc third category
4 new test category printer category
依旧......
我想在他们的描述字段中找到具有相同单词(可以是类似打印机但未预定义)的计数。 对于ex输出应该是:
Total Word which is same
2 printer
2 test
我尝试使用带有布尔选项的http://dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html示例,但它没有提供所需的输出。
以下是我给出的打印机的例子,可以是任何东西。 我不想在查询中指定这个单词,因为它可以是任何东西。 只有在任何地方有相同单词的描述应该在输出中。
先谢谢。
答案 0 :(得分:0)
试试这个:
SELECT SUM(IF(Description like '%printer%',1,0)) AS Printer,SUM(IF(Description like '%test%',1,0)) AS Test FROM `yourTable`
这可能会有所帮助:)
答案 1 :(得分:0)
构建描述中所有单词的字典
$dbh = new PDO($dsn, $user, $password);
$sql = "SELECT description FROM tableName";
foreach($dbh->query($sql, PDO::FETCH_ASSOC) as $result){
foreach (explode(' ',$result['description']) as $word){
$words[] = $word;
}
}
使用array_count_values
计算数组中的重复值,可选择按降序排序
$wordCount = array_count_values($words);
arsort($wordCount);
然后使用array_filter
$filteredWordCount = array_filter($wordCount, function($value){
return $value!=1;
});
这应该为您提供一个数组,其中单词本身为索引,出现次数为值。
迭代数组并运行COUNT
查询
foreach($filteredWordCount as $word=>$value){
$countSQL = 'select COUNT(*) as rowCount from tableName where description like "%' . $word . '%" ';
$res = $dbh->query($countSQL, PDO::FETCH_ASSOC);
$count[$word] = $res->fetch()['rowCount'];
}
对数值进行排序,就像之前一样,并将其打印出来
arsort($count);
print_r($count);
如果您需要行数的条件,例如,只返回出现在5个以上记录中的单词,您可以像这样调整查询
foreach($filteredWordCount as $word=>$value){
$countSQL = 'select COUNT(*) as rowCount from domains where description like "%' . $word . '%" HAVING rowCount > 5';
$res = $dbh->query($countSQL, PDO::FETCH_ASSOC);
$c = $res->fetch()['rowCount'];
if (isset($c)){
$count[$word] = $c;
}
}