5

ツイートのテキストやツイートをツイートしたユーザーのスクリーンネームなど、多くのTwitterツイートの情報を格納するテーブルがあります。ツイートにはハッシュタグ(#で始まる)が含まれています。特定のユーザーがツイートしたハッシュタグの数を数えたいと思います。

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

4

2 に答える 2

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

しかし....テーブルが巨大な場合、それは厄介なクエリです。1人のユーザーのカウントが必要な場合は、内部選択で特定のユーザーを指定できます。このような:

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
于 2012-10-04T22:18:54.943 に答える
2

クエリを実行する必要がある頻度によっては、MySQLがtweet_text列の解析と再解析に多くのCPU時間を費やす原因となる可能性があります。hashtag_qty最初に行にデータを入力するときに、列(または同様のもの)を追加し、そこにハッシュタグ要素の数を保存することを強くお勧めします。

于 2012-10-04T22:02:15.120 に答える