Най-простият начин да изключите публикации, чийто общ брой гласове е по-малък от нула, е както следва:
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, така че автоматично избягвате целочислено аритметично закръгляване
Отказ от отговорност:Кодът може да не се компилира или да не работи така, както е бил включен на телефона ми (но има разумен шанс да работи)