繁体   English   中英

如何计算在mysql数据库行中特定单词的出现?

[英]How to count the occurrence of a specific word in a Mysql db row?

我是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”的出现。 在上面的示例中,“ ”在第一行中两次出现,在第二行中一次出现。 请同样指导我。

StackOverflow上有许多尝试使用纯SQL的解决方案,但是大多数解决方案都计算字符串而不是单词。 因此, 让我们重申一下

一般来说,SQL,尤其是MySQL,并不是最适合该工作的。 您最好使用PHP(如果结果集“足够小”):

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

存在基于str_word_count() 替代性更丰富的解决方案

请注意, 可以在纯SQL中实现:

  • 具有这样的存储过程

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

  • 即使没有存储过程(但借助辅助表 )。

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

我想采用基于PHP的解决方案的好处显而易见。

查询此:

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

小提琴演示

编辑:

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

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

尝试使用substr_count

substr_count ( string $haystack , string $needle)

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

传递数组中的所有行:

$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
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM