在Stackoverflow上有人的帮助下,我几乎达到了查询完美的程度。我需要一些帮助来调整查询以满足我的需求,我希望有人可以再次帮助我。
在这种情况下,我有以下两个表:
Tweet
和
Tweet_tags
每条推文都有一个标签,推文可以有更多相同的标签。我想计算自发布推文以来,在一周的时间跨度内有多少推文具有相同的标签。
这是现在的查询:
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
此查询的结果是:
| ID | Tag | Cnt |
-------------------------------
| 1 | Testtag | 2 |
| 2 | Testtag | 1 |
| 3 | tweettag3 | 1 |
| 4 | tweettag2 | 1 |
我在我的数据库中有2次testtag,所以第一个结果是正确的,tweettag3和tweettag2在我的数据库中1次也很好,但是当我再次添加它们时,这些也可能会显示多个结果。我尝试在DISTINCT
上使用s.tag
来删除重复的结果,但这会给我一个语法错误。
所以我希望它是:
| ID | Tag | Cnt |
-------------------------------
| 1 | Testtag | 2 |
| 2 | tweettag3 | 1 |
| 3 | tweettag2 | 1 |
有人可以帮我解决这个问题吗?如果您需要更多信息,请说出来!
谢谢!
编辑:
表格如下:
Tweet
---------------
ID
Message
users_id
Date
Tweet_tags
---------------
id
tag
tweet_id
答案 0 :(得分:3)
您可以使用select distinct
,因此查询将为:
SELECT distinct 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
只需从选择中删除id字段。
如果你想要一个id,那么你可以使用隐藏列的MySQL功能:
select t.id, s.tag, . . .
group by tag
order by cnt desc
答案 1 :(得分:1)
尝试此查询
SELECT
t.id ,
s.tag ,
s.count
FROM twitter.tweet t
JOIN (
SELECT
COUNT(id) as count,
tweet_id,
tag
FROM tweet_tags
GROUP BY tweet_id
) as s ON s.tweet_id = t.id
AND t.tag = s.tag
ORDER BY cnt DESC