這相當於您的查詢,與表的別名,以使其更易於閱讀,BETWEEN取代由兩個不等式謂詞和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
兩兩件事彈出在我這裏...
首先,沒有GROUP BY
。要通過「標記」來計數,您需要在GROUP BY tag
。
其次,您正在比較「標記」和「日期」。我不知道你的桌子,但那看起來不正確。 (我希望「日期」是一個DATETIME或TIMESTAMP和「標籤」是一個字符串(也許就是我的女兒所說的「散列標籤」,或者是tumblr她在說什麼?)
如果我瞭解您的要求:
對於每條推文以及與該推文關聯的每個標籤,您希望獲得其他推文的數量,這些推文具有匹配的標籤,這些推文是在日期之後7天內製作的推文
得到這個結果的一種方法是使用相關的子查詢(這可能是最容易理解的方法,但可能不是從性能角度來看最好的方法)。
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)
)會讓您計算「相關」推文的數量。
注意:返回的計數將包括原來的推文本身。
注意:從上面的查詢中刪除LEFT
關鍵字應返回等效結果,因爲tweet /標記(來自t/s)保證與自身匹配(來自r/q),只要該標記不是null並且鳴叫date
不爲空。
這些查詢將在大型集上出現問題。爲了可接受的性能,將需要適當的覆蓋索引:
... ON twitter.tweet_tags (tag, tweet_id)
... ON twitter.tweet (date)
在切向上不是,在查詢中指定數據庫名稱不是一個好主意。簡單選擇'twitter'作爲默認數據庫,並從實際查詢中省略數據庫名稱。這裏可能並不重要,但考慮數據庫名稱被硬編碼的真實世界的應用程序。例如,如果你想擁有一個單獨的生產數據庫和測試數據庫? –