0

在 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,所以第一个结果是正确的,tweettag3 和 tweettag2 在我的数据库中有 1 次,所以这也很好,但是当我再次添加它们时,它们可能也会显示多个结果。我尝试使用DISTINCTons.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
4

2 回答 2

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
于 2013-01-18T19:14:51.007 回答
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
于 2013-01-18T19:16:13.210 回答