2016-02-04 19 views
1

我正在嘗試爲MyBB論壇開發一種「壞詞」插件,並且我想問你使用SQL命令的幫助。來自列表的SQL中文文本計數子串

讓simplyfy的解決方案就有關欄目:

表:也就是說
列1:號碼,的recordId
列2:VARCHAR,BADWORD
- 這表包含只是一個不允許話
列表
表:帖子
列1:數量,帖子ID
列2:號碼,用戶ID
欄3:mediumt ext,postBody
- 這是發帖的ID,發送它的人和帖子的文本。

表:用戶
列1:號碼,用戶ID
列2:數量,badWordCount
- 基本usere表是由含有髒話

數量現在我的專欄擴大。 對於此請求是否存在一個純SQL解決方案?

對於「posts」中的每一行,請選擇mediumtext列「postBody」。一旦進入,循環「單詞」表。每次你截取任何不好的單詞時,都要通過用戶的id爲users.badWordCount添加+1。

在一篇文章中,可能會有很多不同的(或相同的)不好的單詞。我需要找到所有這些,指望他們再壞的話的號碼添加到由誰來爲創建

出於演示後每個用戶:

字(ID,BADWORD):
1 ,FCK
2,btch

帖子(帖子ID,用戶ID,postBody):
1,1,你好,你FCK btch
2,2,沒有,你FCK你FCK
3,1,啊哈,謝謝你

執行後,應導致

用戶(用戶ID,badwordCount)
1,3-
2,2-

回答

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在後的單詞。然後通過用長度更長的東西替換單詞來計算單詞的數量。然後,測量更換後的長度變化。

+0

@ Raffaello.D.Huke。 。 。是的,第一個版本的錯誤順序是減法。 –

+0

yeap,我看到了你的編輯。這是天才! –

+0

**來自帖子p加入 單詞w ** ..什麼帖子,p,單詞和w代表這裏?問起因爲你縮短了一些表格命名等等,從我的文章中,當然,我的解決方案中的表格和命名是不同的,所以可以肯定的是,在我更改表格和列命名後它將起作用。謝謝 – Zorak