Mysql
 sql >> база данни >  >> RDS >> Mysql

Как мога да преброя броя на публикациите, които имат или нула, или положителна оценка?

Най-простият начин да изключите публикации, чийто общ брой гласове е по-малък от нула, е както следва:

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)

Ключовата част тук е having sum(value) < 0 които избират публикации с нетни отрицателни гласове.

От коментари...

За да намерите потребители, които имат твърде много „лоши“ отговори, вероятно трябва да върнете колко „добри“ отговора са дали и да решите дали като цяло са „лош“ потребител. Например, потребител, който има 5 отговора, които всички са лоши, е много различен от потребител с 1000 отговора, от които само 5 са ​​лоши, въпреки че и двамата имат по 5 лоши отговора.

Опитайте това:

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

Няколко бележки за малко SQL Kung Fu вътре:

  • в MySQL true е 1, а false е 0, така че като сумирате условие, вие преброявате колко пъти е вярно. Това е много по-лесно за кодиране и по-лесно за четене от тромавото SUM(CASE ...) изрази, необходими на други БД
  • гмуркане на броя по SUM(.01) (за което току-що се сетих BTW) е най-краткият начин да получите процент, тъй като не само опростява израза, но и съгласува отговора с float, така че автоматично избягвате целочислено аритметично закръгляване

Отказ от отговорност:Кодът може да не се компилира или да не работи така, както е бил включен на телефона ми (но има разумен шанс да работи)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Има ли начин да се игнорират колони, които не съществуват във INSERT?

  2. Как да пропуснете ред при импортиране на лош дъмп на MySQL

  3. Как да решите MySQL innodb Изчакване за заключване на метаданни на таблицата на TRUNCATE TABLE?

  4. Как да замените MySQL с Percona на Plesk CentOS 7

  5. MySQL задейства полето за актуализиране въз основа на сумата от колона от друга таблица