2016-03-19 6 views
1

SQL Anfänger hier.Zählen Datensätze, wo ihre Stimme in einer anderen Tabelle zählen ein Kriterium

Ich habe zwei Tabellen, Kommentare und Stimmen. Ich habe comments.id und votes.commentid, mit denen ich Kommentare zu einem Kommentar hinzufügen kann.

Die Tabellen enthält: comments.id comments.text

votes.commentid (ref comments.id) votes.vote (1 oder -1)

So können die Leute Kommentare zu machen, und andere Leute stimmen über sie ab. Wenn die Menschen ihre Stimme ändern, ist es in der Stimmen-Tabelle spiegelt so jede Person nur einmal abstimmen, so dass es keine Massen Upvoting/downvoting usw.


Was ich versuche, alle Kommentare zu tun holen ist, dass haben weniger als 25% der negativen Stimmen. Ich bin mir nicht sicher, wie ich diese Abfrage schreiben soll. Alles, was ich versuche, ist einfach ein SQL-Fehler.

Also im Grunde möchte ich so etwas wie (verzeihen Sie meine schreckliche sql hier) tun

select text from comments 
where 
count(where votes.commentid=comments.id AND votes.vote<0) < 
(count(where votes.commentid=comments.id AND votes.vote>0)*.25) 

Also habe ich alles auf meine Grenze meiner SQL Verständnis versucht haben, und ich kann nicht eine Syntax finden, die funktioniert. Kannst du helfen?

Antwort

0

Versuchen Sie folgendes:

SELECT text FROM (SELECT commentid, SUM(IF(vote > 0, 1, 0)) AS pos_votes, 
SUM(IF(vote < 0, 1, 0)) AS neg_votes FROM votes GROUP BY commentid) AS vote_count 
INNER JOIN comments ON comments.id = vote_count.commentid WHERE 
(neg_votes * 100/(neg_votes + pos_votes)) <= 25 
+0

, das funktioniert! Was für ein Biest einer Frage! Wie wird es Geschwindigkeit ausführen, wenn die Kommentartabelle beginnt, bis zu 10-20.000 zu kommen? – Raptisoft

+0

Einfache Antwort: Indizes. Komplexe Antwort: vielleicht temporäre Tabellen, vielleicht Ansichten. –

+0

Nun, eine Sache, die ich tun könnte, ist ein Boolean in der Kommentartabelle jedes Mal zu aktualisieren, wenn jemand abstimmt ... also wann immer eine Abstimmung stattfindet, wird dieser Boolean gesetzt oder nicht gesetzt, was dazu beitragen könnte, die Last zu verteilen ... seitdem Abfrage ist nur "ist das Boolesche Set." – Raptisoft

Verwandte Themen