La forma más sencilla de excluir publicaciones cuyo total de votos sea inferior a cero es así:
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)
La parte clave aquí es el having sum(value) < 0
que seleccionan publicaciones con votos negativos netos.
De los comentarios...
Para encontrar usuarios que tienen demasiadas respuestas "malas", probablemente debería devolver cuántas respuestas "buenas" dieron y decidir si en general son un usuario "malo". Por ejemplo, un usuario que tiene 5 respuestas todas malas es muy diferente a un usuario con 1000 respuestas de las cuales solo 5 son malas, aunque ambos tengan 5 malas respuestas.
Prueba esto:
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
Un par de notas sobre SQL Kung Fu allí:
- en MySQL, verdadero es 1 y falso es 0, por lo que al sumar una condición, cuenta cuántas veces es verdadero. Esto es mucho más simple de codificar y más fácil de leer que el torpe
SUM(CASE ...)
expresiones que necesitan otras bases de datos - sumergir un conteo por
SUM(.01)
(que, por cierto, acabo de pensar) es la forma más breve de obtener un porcentaje, ya que no solo simplifica la expresión, sino que concerta la respuesta para que flote, por lo que evita automáticamente el redondeo aritmético de enteros
Descargo de responsabilidad:es posible que el código no se compile o funcione tal como estaba en mi teléfono (pero existe una posibilidad razonable de que funcione)