2016-08-20 57 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行

正確的計數

**請投票並標記爲接受的答案,如果你覺得有幫助**