SELECT list_items.text, list_items.item_id, SUM(votes.vote=1) AS upvote, SUM(votes.vote=-1) AS downvote
FROM list_items
LEFT JOIN votes ON list_items.item_id = votes.item_id
La parte complicada son las dos llamadas de suma:si el campo de voto es 1
, luego vote=1
que se evalúa como VERDADERO, que MySQL convertirá en un número entero 1 para los fines de SUM(). Si no es 1, entonces se evalúa como falso, que se convierte en 0 y no hace nada por SUM().
Vaya, necesita tener
GROUP BY list_items.item.id
al final.