総投票数がゼロ未満の投稿を除外する最も簡単な方法は次のとおりです。
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つの回答があるユーザーは、両方とも5つの悪い回答があるにもかかわらず、1000の回答が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カンフーに関するいくつかのメモ:
- MySQLでは、trueは1、falseは0であるため、条件を合計することで、trueの回数をカウントします。これは、不器用な
SUM(CASE ...)
よりも、コーディングがはるかに簡単で、読みやすくなっています。 他のDBが必要とする式 - カウントを
SUM(.01)
で割る (私はところで考えただけです)これは、式を単純化するだけでなく、答えをfloatに一致させるため、整数の算術丸めを自動的に回避するため、パーセンテージを取得する最も簡単な方法です。
免責事項:コードは、私の電話で親指を立てたようにコンパイルまたは機能しない可能性があります(ただし、機能する可能性は十分にあります)