如何在 sql 中创建查询以将句子切成单词并将它们添加到新表中的频率

pro*_*eak 5 mysql sql string recursive-query

我正在尝试做一个查询,我不确定是否有可能我有一个名为句子的表,其中包含 ID、句子和验证,如下图所示。

在此处输入图片说明

我有另一个表,称为字数统计,其中包含 ID、单词和频率。所以我希望当一个句子输入更新或删除时,该表相应地更新或每天更新,因为可能有很多句子

我的预期输出类似于下图。

在此处输入图片说明

任何想法都是可行的,任何人都可以帮忙。

GMB*_*GMB 5

如果您运行的是 MySQL 8.0,我会为此推荐一个递归公用表表达式。这个想法是迭代地遍历每条消息,沿途将其拆分为单词。然后剩下要做的就是聚合。

with recursive cte as (
    select 
        substring(concat(sent, ' '), 1, locate(' ', sent)) word,
        substring(concat(sent, ' '), locate(' ', sent) + 1) sent
    from messages
    union all
    select 
        substring(sent, 1, locate(' ', sent)) word,
        substring(sent, locate(' ', sent) + 1) sent
    from cte
    where locate(' ', sent) > 0
)
select row_number() over(order by count(*) desc, word) wid, word, count(*) freq
from cte 
group by word
order by wid
Run Code Online (Sandbox Code Playgroud)

在早期版本中,您可以使用数字表模拟相同的行为。

DB Fiddle 上的演示

样本数据:

发送 | 验证
:------------------------- | ----:
你好,我的名字是亚历克斯 |  null
嘿alin 和alex 我是tom |  null
你好亚历克斯我的名字是阿林 |  空值

结果:

宽| 词 | 频率
--: | :----- | ---:
  1 | 亚历克斯 | 3
  2 | 阿林| 2
  3 | 你好 | 2
  4 | 是 | 2
  5 | 我的 | 2
  6 | 姓名 | 2
  7 | 和| 1
  8 | 嘿| 1
  9 | 我是 | 1
 10 | 汤姆 | 1

在单独的表中维护查询结果时,可能比您想象的要复杂:您需要能够根据原始表的变化插入、删除或更新目标表,而这不能在 MySQL 中的单个语句中完成。此外,使原始表中的标志保持最新会产生竞争条件,在更新目标表时可能会发生更改。

一个更简单的选择是将查询放在视图中,这样您就可以获得有关数据的始终最新的观点。为此,您可以将上述查询包装在一个create view语句中,例如:

create view words_view as < above query >;
Run Code Online (Sandbox Code Playgroud)

如果性能成为问题,那么您还可以定期截断和重新填充单词表。

truncate table words;
insert into words < above query >;
Run Code Online (Sandbox Code Playgroud)