Nejjednodušší způsob, jak vyloučit příspěvky, jejichž celkový počet hlasů je menší než nula, je tento:
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)
Klíčovou částí je zde having sum(value) < 0
které vybírají příspěvky s čistými zápornými hlasy.
Z komentářů...
Chcete-li najít uživatele, kteří mají příliš mnoho „špatných“ odpovědí, pravděpodobně byste měli vrátit, kolik „dobrých“ odpovědí učinili, a rozhodnout, zda jsou celkově „špatným“ uživatelem. Například uživatel, který má 5 odpovědí, které jsou všechny špatné, se velmi liší od uživatele s 1000 odpověďmi, z nichž pouze 5 je špatných, i když oba mají 5 špatných odpovědí.
Zkuste toto:
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
Pár poznámek k nějakému SQL Kung Fu tam:
- v MySQL je true 1 a false je 0, takže sečtením podmínky spočítáte, kolikrát je pravdivá. Toto je mnohem jednodušší kódovat a snáze číst než neohrabané
SUM(CASE ...)
výrazy potřebné pro jiné DB - počítání o
SUM(.01)
(což mě mimochodem jen napadlo) je nejkratší způsob, jak získat procenta, protože nejen zjednodušuje výraz, ale uvádí odpověď do plovoucí podoby, takže se automaticky vyhnete aritmetickému zaokrouhlování celých čísel
Zřeknutí se odpovědnosti:Kód se nemusí zkompilovat nebo fungovat tak, jak byl načten na mém telefonu (ale existuje rozumná šance, že bude fungovat)