Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak mogę policzyć posty, które mają zerowy lub pozytywny wynik głosów?

Najprostszy sposób na wykluczenie postów, których łączna liczba głosów jest mniejsza niż zero, jest następujący:

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)

Kluczową częścią jest tutaj having sum(value) < 0 które wybierają posty z negatywnymi głosami netto.

Z komentarzy...

Aby znaleźć użytkowników, którzy mają zbyt wiele „złych” odpowiedzi, prawdopodobnie powinieneś zwrócić liczbę „dobrych” odpowiedzi, które udzielili, i zdecydować, czy ogólnie są „złymi” użytkownikami. Na przykład użytkownik, który ma 5 złych odpowiedzi, bardzo różni się od użytkownika z 1000 odpowiedziami, z których tylko 5 jest złych, mimo że obaj mają 5 złych odpowiedzi.

Spróbuj tego:

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

Kilka uwag na temat niektórych SQL Kung Fu:

  • W MySQL prawda to 1, a fałsz to 0, więc sumując warunek, liczysz, ile razy jest on prawdziwy. Jest to znacznie prostsze do napisania i łatwiejsze do odczytania niż niezdarny SUM(CASE ...) wyrażenia potrzebne innym DB
  • Nurkowanie licznika przez SUM(.01) (o czym dopiero pomyślałem BTW) to najkrótszy sposób na uzyskanie wartości procentowej, ponieważ nie tylko upraszcza wyrażenie, ale także ujednolica odpowiedź na zmienne, dzięki czemu automatycznie unikasz zaokrąglania liczb całkowitych

Zastrzeżenie:kod może się nie skompilować lub nie działać tak, jak został wczytany na moim telefonie (ale jest rozsądna szansa, że ​​zadziała)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zrzuć bazę danych mysql do kopii zapasowej w postaci zwykłego tekstu (CSV) z wiersza poleceń

  2. Użycie podniesionego wyjątku PDO nie mogło znaleźć sterownika

  3. Optymalizacja ORDER BY

  4. mySql:pobiera wiersze, w których liczba słów w komórce (ciąg oddzielony przecinkami) ma taką samą wartość jak dopasowana komórka

  5. replikacja mysql - serwer podrzędny na jednej bazie danych