这相当于您的查询,与表的别名,以使其更易于阅读,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'作为默认数据库,并从实际查询中省略数据库名称。这里可能并不重要,但考虑数据库名称被硬编码的真实世界的应用程序。例如,如果你想拥有一个单独的生产数据库和测试数据库? –