【问题标题】:SQL SUM and COUNT returning wrong valuesSQL SUM 和 COUNT 返回错误值
【发布时间】:2012-07-18 16:11:47
【问题描述】:

我发现了一堆类似的问题,但对我没有任何帮助,或者我太愚蠢了,无法正确解决问题。 如果我使用 COUNT(DISTINCT visits.id),访问计数工作正常,但投票计数完全错误 - 它显示的值比应有的值大 3 到 4 倍。

这就是查询

SELECT SUM(votes.rating), COUNT(visits.id)
FROM topics
LEFT JOIN visits ON ( visits.content_id = topics.id )
LEFT JOIN votes ON ( votes.content_id = topics.id )
WHERE topics.id='1'
GROUP BY topics.id

votes 表如下所示

id int(11) | rating tinyint(4) | content_id int(11) | uid int(11)

访问

id int(11) | content_id int(11) | uid int(11)

主题表格

id int(11) | name varchar(128) | message varchar(512) | uid int(11)

帮助?

【问题讨论】:

  • 不相关,但您应该使用WHERE topics.id=1 而不是='1',因为id 是一个int 列。

标签: sql count sum


【解决方案1】:

基本上,您是在求和或计算可能返回的总行数。所以,如果每个 id 有 3 次访问和 4 票,那么访问次数将乘以 4,票数将乘以 3。

我认为您想要的最容易通过使用子查询来完成:

SELECT (SELECT SUM(v.rating) FROM votes v WHERE v.content_id = t.id), 
       (SELECT COUNT(vi.id) FROM visits vi WHERE vi.content_id = t.id)
FROM topics t
WHERE t.id=1 
GROUP BY t.id

【讨论】:

    【解决方案2】:

    我怀疑问题出在与表投票的联接中。
    如果选票不止一行,您还将使用重复的行进行计数。
    如果您使用 distinct,您将跳过 Id 的重复(由于加入投票)。
    作为第一个 tiral,我将暂时取消加入投票,看看会发生什么。
    希望对你有帮助

    【讨论】:

      【解决方案3】:

      没有看到数据,调试起来有点困难,但我猜这是因为访问次数多于投票数。以下内容应该适合您:

      SELECT (SELECT SUM (rating) FROM votes WHERE votes.content_id = topics.id), (SELECT COUNT (1) FROM visits WHERE visits.content_id = topics.id) FROM topics WHERE topics.id = 1

      【讨论】:

        【解决方案4】:

        您需要将其作为两个单独的子查询来执行:

        SELECT sumrating, numvisit
        FROM (select visits.content_id, count(*) as numvisits
              from visits
              ) tvisit left outer join
             (select votes.content_id, SUM(votes.rating) as sumrating 
              from votes
              group by votes.content_id
             ) v
             ON ( v.content_id = tvisit.content_id )
        WHERE tvisit.content_id='1'
        

        事实证明,您根本不需要加入主题表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-30
          • 2014-11-01
          相关资源
          最近更新 更多