Mysql Distinct给出了语法错误 - 删除重复的结果

时间:2013-01-18 19:03:24

标签: mysql sql

在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

2 个答案:

答案 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