SQL mediumtext从列表中计算子字符串

时间:2016-02-04 01:38:50

标签: mysql sql database

我正在尝试为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-

1 个答案:

答案 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在帖子中查找单词。然后通过用长度更长的东西替换单词来计算单词的数量。然后,测量更换后长度的变化。