2016-08-20 27 views
1

我有计数问题在右连接,与此代码我可以指望有多少visites有一个视频右MySQL的计数加入一些返回错误的值

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的条目时,其余值都可以,但我认为当我在数据库中有更多条目时,我将获得更多这个错误值的问题

我无法找到任何有用的这种简单的查询,如格式。

回答

1

我觉得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有两个表中的同类型:如果有重复您也可以运行该代码看看。

+0

哦,男人,废话,我得到了3845复制,因为我有2 + 2的意见,thx其真正的帮助,即时盲目大声笑;)现在我将video_id设置为fm_videos中的唯一ID – Javilico

0

其实,如果你select *,你会看到他们被莫名其妙地计算一些空fm_views行,添加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行

正确的计数

**请投票并标记为接受的答案,如果你觉得有帮助**