Der einfachste Weg zum Ausschließen von Beiträgen, deren Gesamtstimmen weniger als null beträgt, ist wie folgt:
SELECT count(1)
FROM qanda question
JOIN qanda answer ON question.Id = answer.related
WHERE answer.related IS NOT NULL
AND answer.user_id = 2
AND question.free IS NULL
AND question.id not in (
select post_id
from votes
group by post_id
having sum(value) < 0)
Der Schlüsselteil hier ist der having sum(value) < 0
die Posts mit negativen Nettostimmen auswählen.
Aus Kommentaren...
Um Benutzer zu finden, die zu viele "schlechte" Antworten haben, sollten Sie wahrscheinlich zurückgeben, wie viele "gute" Antworten sie gegeben haben, und entscheiden, ob sie insgesamt ein "schlechter" Benutzer sind. Zum Beispiel unterscheidet sich ein Benutzer, der 5 Antworten hat, die alle schlecht sind, sehr von einem Benutzer mit 1000 Antworten, von denen nur 5 schlecht sind, obwohl beide 5 schlechte Antworten haben.
Versuchen Sie Folgendes:
select
sum(score < 0) bad,
count(*) total,
sum(score < 0) / sum(.01) percent_bad
from (
SELECT coalesce(sum(value), 0) score
FROM qanda question
JOIN qanda answer ON question.Id = answer.related
LEFT JOIN votes ON votes.post_id = answer.id
WHERE answer.related IS NOT NULL
AND answer.user_id = 2
AND question.free IS NULL
AND answer.timestamp > subdate(now(), 365)
GROUP BY answer.id
) scores
Ein paar Anmerkungen zu etwas SQL Kung Fu darin:
- In MySQL ist wahr gleich 1 und falsch gleich 0. Indem Sie also eine Bedingung summieren, zählen Sie, wie oft sie wahr ist. Dies ist viel einfacher zu codieren und leichter zu lesen als das ungeschickte
SUM(CASE ...)
Ausdrücke, die von anderen DBs benötigt werden - Tauchen einer Zählung durch
SUM(.01)
(an den ich übrigens gerade erst gedacht habe) ist der kürzeste Weg, um einen Prozentsatz zu erhalten, da er nicht nur den Ausdruck vereinfacht, sondern die Antwort auf Float konzertiert, sodass Sie automatisch das Runden von Ganzzahlen vermeiden
Haftungsausschluss:Der Code wird möglicherweise nicht kompiliert oder funktioniert nicht so, wie er auf meinem Telefon eingegeben wurde (aber es besteht eine vernünftige Chance, dass er funktioniert)