2016-07-25 3 views
0

Ich habe Probleme, eine Abfrage, dass eine Tabelle mit Posts und eine mit Poststimmen, wo Postsvotes enthält die ID des Beitrags und die Art der Abstimmung (' UP 'oder' DOWN '), gibt die Anzahl der UP- und DOWN-Stimmen für jeden Post aus.COUNT (*) nicht in Ergebnis enthalten, wenn 0 und Probleme Beitritt

habe ich versucht, die folgende Abfrage Ansichten mit:

DROP VIEW P, U, D; 
CREATE VIEW P AS SELECT p.id, p.title, p.content FROM posts as p, users as u WHERE u.id = p.userId GROUP BY p.id ORDER BY p.datetime DESC; 
CREATE VIEW U AS SELECT count(*) as Uvotes, postId FROM postsvotes, posts WHERE posts.id = postsvotes.postId AND postsvotes.type = 'UP' GROUP BY postId; 
CREATE VIEW D AS SELECT count(*) as Dvotes, postId FROM postsvotes, posts WHERE posts.id = postsvotes.postId AND postsvotes.type = 'DOWN' GROUP BY postId; 
SELECT Uvotes, Dvotes, u.postId as postId FROM U, D WHERE u.postId = d.postId GROUP BY postId; 

es irgendwie funktioniert nur, aber wenn es mindestens 1 Stimme ‚UP‘ und 1 Stimme ‚DOWN‘ für den Posten, es ist sonst nicht zu berücksichtigen es. Ich habe herausgefunden, dass das Problem in den U- und D-Ansichten liegt, wo die Datensätze mit 0 Stimmen nicht in der Ansicht angezeigt werden.

Irgendeine Idee, wie man löst?

+0

Sie höchstwahrscheinlich nicht diese Ansichten benötigen, eine einzelne Abfrage die Arbeit erledigen kann - wahrscheinlich eine 'äußere join' verwenden. Wenn Sie Beispieldaten und erwartete Ergebnisse liefern könnten, würde dies das Verständnis erleichtern. – sgeddes

+0

Welches Ergebnis möchten Sie? Bitte fügen Sie hier weitere Details hinzu. –

+0

Danke! Ich bin nicht sehr gut mit SQL, aber ich denke, eine One-Query-Lösung wäre perfekt. ! [Beitragstabelle] (http://imgur.com/Fu0MU3z.png)! [Beitragsliste] (http://imgur.com/CWlJeCA.png) [Das ist das Ergebnis, das ich bekomme] (http: // imgur .com/qE51ekf.png), aber es sollte auch Zeilen mit 0 upvotes und/oder 0 downvotes enthalten, während es im Moment nur Zeilen mit mindestens 1 upvote und 1 downvote gibt. –

Antwort

0

Angenommen, die postvotes Tabelle nur enthält Beiträge, wo es mindestens eine Upvote oder einen Downvote gibt, können Sie die Abfrage unten versuchen.

--Get upvote and downvote count for posts in the postvotes table 
SELECT 
postId 
,count(case when type = 'UP' then 1 end) upvotes 
,count(case when type = 'DOWN' then 1 end) downvotes 
FROM postvotes 
GROUP BY postId 
UNION ALL 
--Get posts that have no votes at all 
SELECT Id, 0, 0 
FROM posts p 
WHERE NOT EXISTS (select 1 from postvotes where postId = p.Id) 
+0

Woohoo! Das löst mein Problem mit SQL. Ich muss in die komplexeren Strukturen schauen, die Sie benutzt haben, die ich nicht vollständig verstehe, ich muss noch viel lernen. Vielen Dank! –

0

Ich glaube, Sie wollen einfach nur eine left join und Aggregation:

SELECT p.postId, 
     SUM(pv.type = 'UP') as Upvotes, 
     SUM(pv.type = 'DOWN') as Downvotes, 
FROM posts p LEFT JOIN 
    postvotes pv 
    ON p.postId = pv.postId 
GROUP BY p.postId;