在mysql中的指定列中获取具有相同随机字的记录

时间:2015-12-11 10:27:15

标签: php mysql

我在表格中有以下数据

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示例,但它没有提供所需的输出。

以下是我给出的打印机的例子,可以是任何东西。 我不想在查询中指定这个单词,因为它可以是任何东西。 只有在任何地方有相同单词的描述应该在输出中。

先谢谢。

2 个答案:

答案 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;
    }
}