2016-08-20 2 views
1

ich ein Problem mit dem Grafen in einem Recht kommen, mit diesem Code kann ich zählen, wie viele visites habe ein Videomysql Zählung mit Recht kommen einige falsche Werte zurück

SELECT video_id, COUNT(video_id) AS Views FROM fm_views GROUP BY video_id ORDER BY Views DESC; 

Es gibt das folgende Beispiel.

video_id Views 
1668306  10 
21041317  4 
3845   2 
13796095  1 
16808537  1 
11170454  1 

Das ist richtig Graf, habe ich jetzt das Beispiel 2, dass die falsche Zählung

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; 

Das ist das Problem, ich komme jetzt, dass (Vereinfachtes Version ohne Nullwerte)

video_id Views 
1668306  10 
21041317  4 
3845   >>4<< This is the problem 
13796095  1 
16808537  1 
11170454  1 

Jetzt bekomme ich 4 Ansichten in Video 3845, wenn ich nur 2 Einträge mit der video_id nach dem richtigen Join habe, der Rest der Werte sind in Ordnung, aber ich denke, wenn ich mehr Einträge in der Datenbank habe, werde ich mehr bekommen Probleme mit diesen falschen Werten

Ich kann keine hilfreich finden mit dieser einfachen Abfrage wie Format.

Antwort

1

Ich finde right join ziemlich schwer zu folgen. left join scheint natürlicher, weil es alle Zeilen in der ersten Tabelle behält. Außerdem kann COUNT()NULL nicht zurückgeben. Also, das ist die Abfrage:

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; 

Wenn diese unerwartete Ergebnisse zurückgibt, dann schlägt er vor, dass Sie schlechte Daten haben, oder Ihre Erwartung ist falsch.

Für die erste Möglichkeit, würde ich empfehlen, dass fm_video(video_id) ist der Primärschlüssel auf der Tabelle (oder zumindest eindeutig). Sie können auch diesen Code ausführen, um zu sehen, ob es Duplikate sind:

select video_id 
from fm_video 
group by video_id 
having count(*) > 1; 

Sie sollten auch prüfen, ob video_id die gleiche Art in beiden Tabellen haben.

+0

Oh Mann, Mist, ich habe 3845 dupliziert, dafür habe ich 2 + 2 Aufrufe, das ist wirklich hilfreich, ich bin blind lol ;) Jetzt setze ich video_id als eindeutige ID in fm_videos – Javilico

0

Eigentlich, wenn Sie select * Sie einige leere fm_views Zeilen sehen sie irgendwie gezählt werden, fügen Sie den WHERE Filter, und schreiben Sie Ihre Anfrage wie folgt:

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; 

Sie müssen nur die null Zeilen herauszufiltern

WHERE fm_views.video_id is not null 

Dies geschieht, wenn die verknüpften Tabellen unterschiedliche Zeilennummern haben, das ist, warum Sie die richtige Anzahl auf 2 Reihen haben

** bitte abstimmen und als akzeptiert kennzeichnen, wenn es hilfreich ist **