计算MySQL列中子字符串的出现次数

时间:2012-10-04 21:41:52

标签: mysql select count

我有一张桌子,存储很多推特推文的信息,包括推文文本和发推文推文的用户的屏幕名称。推文包含主题标签(以#开头),我想计算特定用户推文的主题标签数量:

tweet_id |                       tweet_text                           | screen_name    |
--------------------------------------------------------------------------------------------
       1 | #hashtag1 #otherhashtag2 #hashtag3 some more text          | tweeter_user_1 |
       2 | some text #hashtag1 #hashtag4 more text                    | tweeter_user_2 |
       3 | #hashtag5 #hashtag1 @not a hashtag some#nothashtag         | tweeter_user_1 |
       4 | #hashtag1 with more text                                   | tweeter_user_3 |
       5 | #otherhashtag2 #hashtag3,#hashtag4 more text               | tweeter_user_1 |

如果我要计算tweeter_user_1的主题标签,我期望的结果是8,如果我想要tweeter_user_3的主题标签它应该返回1.我怎么能这样做,假设我的表名是推文。

我试过了这个:SELECT COUNT( * ) FROM tweets WHERE( LENGTH( REPLACE( tweet_text, '#%', '@') = 0 ) ) AND screen_name = 'tweeter_user_1'但它无法正常工作

如果tweeter_user_1的结果也是9,我会很高兴:D

2 个答案:

答案 0 :(得分:8)

这应该为您提供一个screen_names列表以及他们使用的所有主题标签的总数。

SELECT  foo.screen_name, SUM(foo.counts) FROM 
  (
    SELECT screen_name, 
           LENGTH( tweet_text) - LENGTH(REPLACE(tweet_text, '#', '')) AS counts 
    FROM tweet_table 
  ) as foo 
GROUP BY  foo.screen_name

但是....如果表格很大,这是一个讨厌的问题。如果您只需要单个用户的计数,我可以在内部选择中指定特定用户。像这样:

SELECT  foo.screen_name, SUM(foo.counts) FROM 
 (
    SELECT screen_name, 
         LENGTH( tweet_text) - LENGTH(REPLACE(tweet_text, '#', '')) AS counts 
    FROM tweet_table WHERE  screen_name = 'tweeter_user_1' 
 ) as foo 
GROUP BY  foo.screen_name

答案 1 :(得分:2)

根据您运行查询的频率,可能会导致MySQL花费大量的CPU时间来解析和重新分析tweet_text列。我强烈建议添加hashtag_qty列(或类似的)并在填充行开始时存储hashtag元素的数量。