在 Stackoverflow 上某人的帮助下,我几乎达到了查询完美的地步。我需要一些帮助来调整查询以满足我的需要,我希望有人能再次帮助我。
情况是这样的,我有以下 2 个表:
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,所以第一个结果是正确的,tweetag3 和 tweetag2 在我的数据库中有 1 次,所以这也很好,但是当我再次添加它们时,它们也可能会显示多个结果。我尝试在 s.tag
上使用 DISTINCT
来去除重复的结果,但这给了我一个语法错误。
所以我希望它是这样的:
| ID | Tag | Cnt |
-------------------------------
| 1 | Testtag | 2 |
| 2 | tweettag3 | 1 |
| 3 | tweettag2 | 1 |
有人可以帮我解决这个问题吗?如果您需要更多信息,请说出来!
谢谢!!
编辑:
表格是这样的:
Tweet
---------------
ID
Message
users_id
Date
Tweet_tags
---------------
id
tag
tweet_id
最佳答案
您可以只使用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
关于Mysql Distinct给出语法错误-删除重复结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14405809/