2013-01-18 47 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