sql >> Databasteknik >  >> RDS >> Mysql

Hur kan jag räkna antalet inlägg som har antingen noll eller positiv röstpoäng?

Det enklaste sättet att utesluta inlägg vars totala röster är mindre än noll är så här:

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)

Nyckeldelen här är att having sum(value) < 0 som väljer inlägg med negativa röster netto.

Från kommentarer...

För att hitta användare som har för många "dåliga" svar, bör du förmodligen returnera hur många "bra" svar de har gjort och bestämma om de totalt sett är en "dålig" användare. Till exempel, en användare som har 5 svar som alla är dåliga skiljer sig mycket från en användare med 1000 svar varav endast 5 är dåliga, även om de båda har 5 dåliga svar.

Prova detta:

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

Ett par anteckningar om SQL Kung Fu där:

  • i MySQL är sant 1 och falskt är 0, så genom att summera ett villkor räknar du hur många gånger det är sant. Detta är mycket enklare att koda och lättare att läsa än den klumpiga SUM(CASE ...) uttryck som behövs av andra DB
  • dyka en räkning med SUM(.01) (vilket jag precis tänkte på förresten) är det kortaste sättet att få en procentsats, eftersom det inte bara förenklar uttrycket, utan låter svaret flyta så att du automatiskt undviker aritmetisk heltalsavrundning

Ansvarsfriskrivning:Koden kanske inte kompileras eller fungerar som den tummades in på min telefon (men det finns en rimlig chans att det kommer att fungera)



  1. Fyll dynamiskt i flera inmatningsfält från MySQL beroende på vilket listobjekt som valts

  2. Definiera ändringsuppsättning för infogningsfråga i liquibase

  3. Strategier för att hålla två mySQL-databaser (på separata platser) synkroniserade?

  4. Anropa en medlem funktion result() med CodeIgniter