具有右连接的mysql计数返回一些错误值
我在右连接中的计数有问题,使用此代码我可以计算一个视频的访问次数具有右连接的mysql计数返回一些错误值,mysql,join,Mysql,Join,我在右连接中的计数有问题,使用此代码我可以计算一个视频的访问次数 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
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\u id视图
1668306 10
21041317 4
3845>>4我发现右连接
很难理解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\u video(video\u id)
是否是表中的主键(或者至少是唯一的)。您还可以运行此代码以查看是否存在重复项:
select video_id
from fm_video
group by video_id
having count(*) > 1;
您还应该检查video\u id
在两个表中是否具有相同的类型。实际上,如果选择*
,您将看到一些空fm\u视图
行,它们以某种方式被计数,请添加WHERE
过滤器,并按如下方式重写查询:
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
WHERE fm_views.video_id is not null
GROUP BY fm_video.video_id ORDER BY Views DESC, id DESC;
您只需要过滤掉空行
WHERE fm_views.video_id is not null
如果联接的表具有不同的行号,则会发生这种情况
这就是为什么在2行上有正确的计数
**如果你觉得有帮助的话,请投赞成票并将其标记为接受答案**哦,天哪,废话,我得到了重复的3845,因为我得到了2+2个视图,thx它真的很有帮助,我是瞎子lol;)现在我在fm_视频中将视频_id设置为唯一id
WHERE fm_views.video_id is not null