sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo puedo contar la cantidad de publicaciones que tienen un puntaje de voto cero o positivo?

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)