2013-01-18 82 views
0

我有一個任務來創建一個類似於數據庫的twitter。在這項任務中,我必須篩選熱門話題。我的想法是在發佈推文的日期和7天之後對推文進行數字計數,並按次數排序。計數日期之間的鳴叫(mysql)

我有以下2和表我使用這個查詢:

Table Tweet : id , message, users_id, date 

Table Tweet_tags : id, tag, tweet_id 

從MySQL是不是我在所有的具有1M麻煩從查詢任何結果的強項。 我試過查詢:

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 

查詢工作,但沒有給出結果。我只是無法讓它工作。請你們幫我解決這個問題,或者如果你有更好的方式來獲得熱門話題,請讓我知道!

非常感謝!

+0

在切向上不是,在查詢中指定數據庫名稱不是一個好主意。簡單選擇'twitter'作爲默認數據庫,並從實際查詢中省略數據庫名稱。這裏可能並不重要,但考慮數據庫名稱被硬編碼的真實世界的應用程序。例如,如果你想擁有一個單獨的生產數據庫和測試數據庫? –

回答

1

這相當於您的查詢,與表的別名,以使其更易於閱讀,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) 
+0

嗨,感謝您的快速響應!然而,我得到了與我的查詢完全相同的結果:( – user1362916

+0

@ user1362916:這是因爲(如我所述)我的回覆中的第一個查詢與您的查詢等同(您的查詢太難閱讀了。以便查詢重新格式化的查詢,這樣可以更容易地發現問題。我的答案中後面的查詢應該返回您指定的結果集。 – spencer7593

+0

謝謝!像魅力一樣工作! – user1362916