具有右连接的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