我有一个创建类似数据库的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
查询有效,但没有结果。我无法让它发挥作用。你能帮我解决这个问题,或者如果你有更好的方法来获取热门话题,请告诉我!
非常感谢!
答案 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)