计算日期之间的推文(mysql)

时间:2013-01-18 15:48:07

标签: mysql database

我有一个创建类似数据库的Twitter的任务。在这项任务中,我必须过滤出趋势主题。我的想法是在推文发布日期和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

查询有效,但没有结果。我无法让它发挥作用。你能帮我解决这个问题,或者如果你有更好的方法来获取热门话题,请告诉我!

非常感谢!

1 个答案:

答案 0 :(得分: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

其次,您将“tag”与“date”进行比较。我不知道你的桌子,但这看起来不对。 (我希望“date”是DATETIME或TIMESTAMP,而“tag”是一个字符串(也许是我女儿所说的“哈希标签”。或者是她正在谈论的那个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 / tag(来自t / s)保证匹配自身(来自r / q),只要标签不为空,推文date不为空。

这些查询在大型集上会有问题。为了获得可接受的绩效,需要适当的覆盖指数:

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

...  ON twitter.tweet (date)