--- карма пользователя n.
SET @user_exp = (SELECT exp FROM users where id = {n});
SELECT count(*) FROM users
WHERE exp > @user_exp OR (exp = @user_exp AND user.id < {n});
Второе условие в OR нужно на тот случай, если у двух пользователей окажется одинаковая карма (сортировать тогда нужно и по exp, и по id, чтобы пользователи с одинаковой кармой не прыгали с места на место даже без изменения кармы). Если этим можно пренебречь, то и условием можно пренебречь.
Но лучше правда обновлять специальное поле каждые 5 минут скриптом.