我正在尝试为MyBB论坛开发一些“坏词”插件,我想请求您帮忙解决SQL命令。
让我们只使用相关列的解决方案:
表:单词
第1列:数字,记录ID
Column2:varchar,badWord
- 这个表只包含一个不允许的单词列表
表:帖子
第1列:数字,邮政ID
第2列:数字,用户ID
第3栏:中等文字,邮政身份
- 发送的帖子,发送的帖子和帖子的文本
表:用户
第1列:数字,用户ID
Column2:number,badWordCount
-basic usere table由我的专栏扩展,其中包含多个不良单词
现在。 是否存在针对此请求的纯SQL 解决方案?
对于“帖子”中的每一行,选择mediumtext列“postBody”。进入后,循环“单词”表。每当您拦截任何不良单词时,请按用户ID为users.badWordCount添加+1。
在一篇文章中,可能会有许多不同(或相同)的坏词。我需要找到所有这些并计算它们,然后为每个用户添加坏词的数量,由谁创建帖子
示范:
单词(id,badWord):
1,fck
2,btch
帖子(postID,userID,postBody):
1,1,你好,fck you btch
2,2,不,你搞砸了 3,1,Aaah,fck you
执行后,应该导致
用户(userID,badwordCount)
1,3
2,2-
答案 0 :(得分:3)
有一种纯粹的SQL方法,虽然这可能不是最好的方法。
select userId,
sum(length(replace(concat(' ', w.postBody, ' '), concat(' ', w.badword, ' '), concat(w.word, '123'))) -
length(concat(' ', w.postBody, ' '))
)
from posts p join
words w
on concat(' ', w.postBody, ' ') like concat('% ', w.badword, '% ')
group by userId;
空格用于分隔文本中的单词。这可能不是您的目的所必需的。没有逻辑的空格:
select userId,
sum(length(replace(w.postBody, w.word, concat(w.badword, ' '))) -
length(w.postBody)
)
from posts p join
words w
on w.postBody like concat('% ', w.badword, '% ')
group by userId;
我们的想法是使用like
在帖子中查找单词。然后通过用长度更长的东西替换单词来计算单词的数量。然后,测量更换后长度的变化。