我有一张桌子,存储很多推特推文的信息,包括推文文本和发推文推文的用户的屏幕名称。推文包含主题标签(以#开头),我想计算特定用户推文的主题标签数量:
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
答案 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元素的数量。