これはクエリと同等であり、読みやすくするためにテーブルエイリアスがあり、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でなく、ツイートがLEFT
nullでない限り、ツイート/タグ(t / sから)はそれ自体(r / qから)と一致することが保証されるため、上記のクエリからキーワードを削除すると、同等の結果が返されますdate
nullではありません。
これらのクエリは、大規模なセットで問題のあるパフォーマンスを示します。許容可能なパフォーマンスを得るには、適切なカバーインデックスが必要になります。
... ON twitter.tweet_tags (tag, tweet_id)
... ON twitter.tweet (date)