Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kann ich die Anzahl der Beiträge zählen, die entweder null oder einen positiven Stimmenwert haben?

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)