Prova detta. använd grupp efter med namnet på kategorin. Jag har kommenterat den skapade at-satsen som du angav, du kan avkommentera den om du vill använda den.
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;
du kommer att märka att jag inte använde nyckelordet JOIN utan istället filtrerade resultaten av frågan med hjälp av endast WHERE-satser, vilket kan vara lättare att förstå. om du vill lära dig mer om JOIN, här är en handledning .
Här är också en handledning om SQL-alias (AS-klausulen). Faktum är att det finns en massa fler handledningar på den här webbplatsen för en massa olika SQL-ämnen som inte är plattformsberoende.
redigera: fixat enligt kommentarer, lagt till abs-funktionen,