我在右连接中遇到计数问题,使用这段代码我可以计算有多少访问者有视频
SELECT video_id, COUNT(video_id) AS Views FROM fm_views GROUP BY video_id ORDER BY Views DESC;
它返回以下示例。
video_id Views
1668306 10
21041317 4
3845 2
13796095 1
16808537 1
11170454 1
这是正确的计数,现在我将示例 2 放在错误的计数中
SELECT fm_video.*, IFNULL(COUNT(fm_views.video_id), 0) AS Views FROM fm_views RIGHT JOIN fm_video ON fm_video.video_id = fm_views.video_id GROUP BY fm_video.video_id ORDER BY Views DESC, id DESC;
这就是问题所在,现在我明白了(没有零值的简化版本)
video_id Views
1668306 10
21041317 4
3845 >>4<< This is the problem
13796095 1
16808537 1
11170454 1
现在我在视频 3845 中获得 4 次观看,当我在正确的连接后只有 2 个带有该 video_id 的条目时,其余值都可以,但我认为当我在数据库中有更多条目时,我会遇到更多问题有了这个错误的值(value)观
对于这种简单的查询格式,我找不到任何有用的信息。
最佳答案
我发现 right join
很难理解。 left join
看起来更自然,因为它将所有行保留在第一个表中。此外,COUNT()
不能返回 NULL
。所以,这是查询:
SELECT vd.*, COUNT(vw.video_id) AS Views
FROM fm_video vd LEFT JOIN
fm_views vw
ON vd.video_id = vw.video_id
GROUP BY vd.video_id
ORDER BY Views DESC, id DESC;
如果这返回了意想不到的结果,则表明您的数据有误,或者您的预期是错误的。
对于第一种可能性,我建议验证 fm_video(video_id)
是表中的主键(或至少是唯一的)。您还可以运行此代码以查看是否存在重复:
select video_id
from fm_video
group by video_id
having count(*) > 1;
您还应该检查 video_id
在两个表中是否具有相同的类型。
关于mysql count with right join返回一些错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39054004/