sql >> Database >  >> RDS >> Mysql

Hoe kan ik het aantal berichten tellen dat nul of een positieve stemscore heeft?

De eenvoudigste manier om berichten uit te sluiten waarvan het totale aantal stemmen minder dan nul is, is als volgt:

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)

Het belangrijkste onderdeel hier is de having sum(value) < 0 die berichten selecteren met netto negatieve stemmen.

Uit reacties...

Om gebruikers te vinden die te veel "slechte" antwoorden hebben, moet u waarschijnlijk teruggeven hoeveel "goede" antwoorden ze hebben gegeven en beslissen of ze over het algemeen een "slechte" gebruiker zijn. Een gebruiker die bijvoorbeeld 5 antwoorden heeft die allemaal slecht zijn, is heel anders dan een gebruiker met 1000 antwoorden waarvan er slechts 5 slecht zijn, ook al hebben ze allebei 5 slechte antwoorden.

Probeer dit:

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

Een paar opmerkingen over wat SQL Kung Fu daarin:

  • in MySQL is waar 1 en onwaar is 0, dus door een voorwaarde op te tellen, tel je hoe vaak deze waar is. Dit is veel eenvoudiger te coderen en gemakkelijker te lezen dan de onhandige SUM(CASE ...) expressies die andere DB's nodig hebben
  • duiken met SUM(.01) (waar ik net aan dacht btw) is de kortste manier om een ​​percentage te krijgen, omdat het niet alleen de uitdrukking vereenvoudigt, maar het antwoord ook laat zweven zodat je automatisch gehele rekenkundige afrondingen vermijdt

Disclaimer:de code wordt mogelijk niet gecompileerd of werkt niet zoals deze op mijn telefoon is ingevoerd (maar er is een redelijke kans dat het werkt)



  1. Retourneer alle niet-berekende kolommen uit een tabel in SQL Server

  2. Wanneer SQL_NO_CACHE gebruiken?

  3. Wat zijn de sqlite-equivalenten van MySQL's INTERVAL en UTC_TIMESTAMP?

  4. Oracle sql tutorial :De dataset beperken