0

ツイッターのようなデータベースを作成する割り当てがあります。そして、この課題では、トレンドトピックを除外する必要があります。私の考えは、ツイートが行われた日から7日後までの間に特定のタグが付いたツイートをカウントし、カウント順に並べることでした。

このクエリに使用している次の2つのテーブルがあります。

Table Tweet : id , message, users_id, date

Table Tweet_tags : id, tag, tweet_id

mysqlは私の強みではないので、クエリから結果を取得するのに問題があります。私が試したクエリは次のとおりです。

Select
      Count(twitter.tweet_tags.id) As NumberofTweets,
      twitter.tweet_tags.tag
From twitter.tweet 
Inner Join twitter.tweet_tags On twitter.tweet_tags.tweet_id = twitter.tweet.id 
WHERE twitter.tweet_tags.tag between twitter.tweet.date and ADDDATE(twitter.tweet.date, INTERVAL 7 day) 
ORDER BY NumberofTweets

クエリは機能しますが、結果は得られません。私はそれを機能させることができません。皆さん、これについて私を助けてくれませんか、またはトレンドトピックを取得するためのより良い方法があれば私に知らせてください!

どうもありがとう!

4

1 に答える 1

1

これはクエリと同等であり、読みやすくするためにテーブルエイリアスがあり、BETWEENが2つの不等式述語に置き換えられ、ADDDATE関数が同等の操作に置き換えられています...

SELECT COUNT(s.id) As NumberofTweets
     , s.tag
  FROM twitter.tweet t 
  JOIN twitter.tweet_tags s 
    ON s.tweet_id = t.id
 WHERE s.tag >= t.date 
   AND s.tag <= t.date + INTERVAL 7 DAY
 ORDER
    BY NumberofTweets

ここで2つのことが飛び出します...

まず、ありませんGROUP BY。「タグ」でカウントを取得するには、で必要ですGROUP BY tag

次に、「タグ」と「日付」を比較しています。私はあなたのテーブルを知りませんが、それは正しく見えません。(「date」はDATETIMEまたはTIMESTAMPであり、「tag」は文字列です(娘が「ハッシュタグ」と呼んでいるものかもしれません。それとも、彼女が話しているtumblrですか?)


私があなたの要件を理解している場合:

ツイートごと、およびそのツイートに関連付けられたタグごとに、ツイートの日時から7日以内に作成された、一致するタグを持つ他のツイートの数を取得する必要があります。

この結果を取得する1つの方法は、相関サブクエリを使用することです。(これはおそらく理解するのが最も簡単なアプローチですが、パフォーマンスの観点からはおそらく最良のアプローチではありません)。

SELECT t.id
     , s.tag
     , ( SELECT COUNT(1)
           FROM twitter.tweet_tags r
           JOIN twitter.tweet q
             ON q.id = r.tweet_id
          WHERE r.tag = s.tag
            AND q.date >= t.date
            AND q.date <= t.date + INTERVAL 7 DAY
       ) AS cnt
  FROM twitter.tweet t 
  JOIN twitter.tweet_tags s 
    ON s.tweet_id = t.id
 ORDER
    BY cnt DESC

別のアプローチは、結合操作を使用することです。

SELECT t.id
     , s.tag
     , COUNT(q.id) AS cnt
  FROM twitter.tweet t 
  JOIN twitter.tweet_tags s 
    ON s.tweet_id = t.id
  LEFT
  JOIN twitter.tweet_tags r
    ON r.tag = s.tag
  LEFT
  JOIN twitter.tweet q
    ON q.id = r.tweet_id
       AND q.date >= t.date
       AND q.date <= t.date + INTERVAL 7 DAY
 GROUP
    BY t.id
     , s.tag
 ORDER
    BY cnt DESC

これらのクエリの両方からのカウントは、それtweet_tags (tweet_id, tag)が一意であることを前提としています。「重複」がある場合は、DISTINCTキーワードを含めると、つまり(およびCOUNT(DISTINCT q.id)の代わりに)「関連する」ツイートの数がわかります。COUNT(1)COUNT(q.id)

注:返されるカウントには、元のツイート自体が含まれます。

注:タグがnullでなく、ツイートがLEFTnullでない限り、ツイート/タグ(t / sから)はそれ自体(r / qから)と一致することが保証されるため、上記のクエリからキーワードを削除すると、同等の結果が返されますdatenullではありません。

これらのクエリは、大規模なセットで問題のあるパフォーマンスを示します。許容可能なパフォーマンスを得るには、適切なカバーインデックスが必要になります。

...  ON twitter.tweet_tags (tag, tweet_id)

...  ON twitter.tweet (date) 
于 2013-01-18T15:57:10.940 に答える