我发现了一些类似的问题,但没有任何对我有用,或者我太愚蠢了,无法正确地做到这一点。 如果我使用 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
投票表格如下所示
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)
帮助?
答案 0 :(得分:2)
基本上,您要汇总或计算可能返回的总行数。因此,如果每个ID有三次访问和四次投票,则访问次数将乘以四次,投票次数将增加三次。
我认为使用子查询可以最简单地完成您想要的任务:
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
答案 1 :(得分:0)
我怀疑问题出在表格投票的加入中 如果投票有多行,您将使用重复的行进行计数 如果你使用distinct,你可以跳过ID的复制(由于加入投票) 作为第一个手段,我将临时摒弃加入选票,看看会发生什么 希望它有所帮助
答案 2 :(得分:0)
没有看到数据,调试起来有点困难,但我猜这是因为访问次数多于投票次数。以下内容适用于您:
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
答案 3 :(得分:0)
您需要将其作为两个单独的子查询执行:
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'
事实证明,您根本不需要加入主题表。