【问题标题】:How to count the occurrence of a specific word in a Mysql db row?如何计算 Mysql 数据库行中特定单词的出现次数?
【发布时间】:2014-08-02 18:11:13
【问题描述】:

我是 PHP 新手。我想计算 MySQL 数据库行中特定单词的出现次数。 例如:有两列名称和描述。

---------------------------------------------------------------
| name | description                                          |
---------------------------------------------------------------
| abcd | My name ***is*** abcd. My father's name ***is*** xyz |
---------------------------------------------------------------
| xyzt | My name ***is*** xyz. I am a good girl.              |
---------------------------------------------------------------

我想从第一行描述列中计算单词“is”的出现次数。在上面的示例中,'is' 在第一行出现 两次,在第二行出现 一次。请指导我。

【问题讨论】:

标签: php mysql


【解决方案1】:

StackOverflow 上有很多纯 SQL 尝试的解决方案,但其中大多数都计算字符串,而不是单词。所以let's reiterate:

一般的 SQL,尤其是 MySQL,并不是最适合这项工作。你最好用 PHP 来做(如果结果集“足够小”): p>

$count = preg_match_all("/\\b$word\\b/", $input, &$matches);

Alternative, richer solutions 基于str_word_count() 存在。

注意它可以用纯SQL实现:

  • with a stored procedure like this one.

    在此示例中,将正则表达式替换为 [[:<:]]your_word[[:>:]] 以匹配特定单词。然后只需SELECT wordcount(your_column) FROM your_table。通过添加输入参数(要计算出现次数的单词)来改进过程。然后*RLIKE CONCAT('[[:<:]]', input_parameter, '[[:>:]]').

  • 即使没有存储过程(但 with the help of an auxiliary table)。

    在此示例中,将 HAVING word <> ' ' 替换为 HAVING word <> 'your_word' 以计算特定单词。 GROUP BY word, maintable.id(而不仅仅是word)逐行获取详细信息。添加WHERE 子句以过滤掉行。缺点:只能将空格识别为单词分隔符。

我认为使用基于 PHP 的解决方案的好处是显而易见的。

【讨论】:

    【解决方案2】:

    查询:

    SELECT name,(CHAR_LENGTH(description)-
            CHAR_LENGTH(REPLACE(description,'is','')))/CHAR_LENGTH('is') AS TotalCount
    FROM TableName
    GROUP BY name
    

    结果:

    NAME    TOTALCOUNT
    abcd    2
    xyzt    1
    

    Fiddle Demo

    编辑:

    由于此查询还计算包含 is 的任何单词(如 'this'),我们可以查询 'is' (前一个空格,后一个空格)。

    SELECT name,(CHAR_LENGTH(description)-
            CHAR_LENGTH(REPLACE(description,' is ','')))/CHAR_LENGTH(' is ') AS TotalCount
    FROM TableName
    GROUP BY name
    

    【讨论】:

    • 整洁,不幸的是,这也会计算“this”、“isoceles”和“prism”。并且mysql没有(AFAIK)有正则表达式替换功能(正则表达式可以描述单词边界)
    • 非常感谢您的及时回复。很快就会尝试:)
    • 这会错过“你知道我叫什么名字吗?”和“是鲍勃吗?”
    【解决方案3】:

    传递数组中的所有行:

    $query= "SELECT * from  yourtable "; 
    $result= $mysqli->query($query);
    while ($row = mysqli_fetch_assoc($result)) {
    $rows[]=$row;
    }
    

    并在数组中使用 count 转换数组:

    foreach ($rows as $row){
    $name=$row['name'];
    $description=$row['description'];
    $myarr[$name]=substr_count($description, 'is');
    }
    

    你得到想要的数组:

    abcd => 2
    xyzt => 1
    ...
    

    【讨论】:

      【解决方案4】:

      尝试使用substr_count

      substr_count ( string $haystack , string $needle)
      

      它计算一个单词在字符串中出现的次数。

      【讨论】:

      猜你喜欢
      • 2015-06-09
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多