pro*_*eak 5 mysql sql string recursive-query
我正在尝试做一个查询,我不确定是否有可能我有一个名为句子的表,其中包含 ID、句子和验证,如下图所示。
我有另一个表,称为字数统计,其中包含 ID、单词和频率。所以我希望当一个句子输入更新或删除时,该表相应地更新或每天更新,因为可能有很多句子
我的预期输出类似于下图。
任何想法都是可行的,任何人都可以帮忙。
如果您运行的是 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)
在早期版本中,您可以使用数字表模拟相同的行为。
样本数据:
发送 | 验证 :------------------------- | ----: 你好,我的名字是亚历克斯 | 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)
| 归档时间: |
|
| 查看次数: |
565 次 |
| 最近记录: |