Опитайте тази. използвайте група по с името на категорията. Коментирах създадената клауза at, както сте посочили, можете да я декомментирате, ако искате да я използвате.
SELECT c.name, SUM(ABS(v.item_id))
FROM categories c,items i, votes v
WHERE c.name = i.name
AND i.item_id=v.item_id
--AND v.created_at > #{1.week.ago}
GROUP BY c.name
ORDER BY SUM(ABS(v.item_id)) DESC LIMIT 5;
ще забележите, че не използвах ключовата дума JOIN, а вместо това филтрирах резултатите от заявката, използвайки само клаузи WHERE, които може да са по-лесни за разбиране. ако искате да научите повече за JOIN, ето урок .
Тук също има урок за SQL псевдоними (клаузата AS). всъщност има още куп уроци на този сайт за куп различни теми за SQL, които не зависят от платформата.
редактиране: коригирано според коментарите, добавена е функцията abs,