2013-04-04 23 views
0

我有一個看起來像這樣的數據:使用sqlite查找列中最常用的單詞?

  movie_id comment 
      1   tom cruise is great 
      1   great action movie 
      2   got teary eyed 
      2   great cast 
      1   tom cruise is hott 

我想返回在評論中最常見的詞的功能,基於什麼movie_id我選擇。所以,如果我查詢movie_id = 1,我會得到:

  tom, 2 
      cruise, 2 
      is, 2 
      great, 2 
      hott, 1 
      action, 1 
      movie, 1 

而如果我查詢movie_id = 2,我會得到:

  got, 1 
      teary, 1 
      eyed, 1 
      great, 1 
      cast, 1 

我看到使用TSQL一些解決方案,但我從來沒有使用過,也沒有明白代碼。尋找一種在sqlite3中做到這一點的方法。

+0

在SQLite中沒有'Split'函數或等價函數,所以這不能在一個簡單的查詢中完成,您可能需要編寫一些代碼。也許使用Subtr()函數做一些工作 – Scotch 2013-04-04 19:59:50

回答

2

你可以用一個非常醜陋的查詢來做到這一點。

select word, count(*) from (
select (case when instr(substr(m.comments, nums.n+1), ' ') then substr(m.comments, nums.n+1) 
      else substr(m.comments, nums.n+1, instr(substr(m.comments, nums.n+1), ' ') - 1) 
     end) as word 
from (select ' '||comments as comments 
     from m 
    )m cross join 
    (select 1 as n union all select 2 union all select 3 
    ) nums 
where substr(m.comments, nums.n, 1) = ' ' and substr(m.comments, nums.n, 1) <> ' ' 
) w 
group by word 
order by count(*) desc 

這是未經測試的。內部查詢需要一個數字列表(這裏僅限於3;您可以看到如何添加更多)。然後它檢查單詞是否在位置n + 1開始。一個詞在一個空格之後開始,所以我在評論的開始處放了一個空格。

然後它把這個詞拉出來,用於聚合的目的。

+0

M是我猜測的movie_id。什麼是數字? – user1956609 2013-04-04 20:18:58

+0

@ user1956609。 。 。 Nums是一個只包含從1開始的整數的表格。我正在使用它來測試註釋中的偏移量,以確定一個單詞是否正在啓動。在這種情況下,它只有3個數字。你可能想要更多的像50或100.你可能已經有一個數字表可用(說在另一個表中的主要ID),你可以使用它。 – 2013-04-04 20:20:20

+0

Gah,我試過instr和charindex在sqlite3中,都沒有被識別爲一個函數。有另一種獲得此功能的方法,還是需要添加自定義功能? – user1956609 2013-04-04 21:01:15