Если у вас есть несколько points_earned/points_loss строк для каждого пользователя в таблицах, вы можете использовать этот запрос: http://sqlfiddle.com/#!9/81b33/1
SELECT
user_id,
SUM(points) AS points
FROM
(
SELECT
a.user_id,
points
FROM
(
SELECT
user_id,
SUM(points_earned) AS points
FROM
points_earned
GROUP BY
user_id
) AS a
UNION
SELECT
user_id,
SUM(points_loss) * - 1 AS points
FROM
points_loss
GROUP BY
user_id
) AS points
GROUP BY
user_id
ORDER BY
points DESC,
user_id ASC
Если вы хотите иметь фактический ранг как число в результате, вы можете использовать этот запрос: http://sqlfiddle.com/#!9/81b33/3
SELECT
user_id,
points,
@curRank := IF (
@prevRank = points,
@curRank,
@incRank
) AS rank,
@incRank := @incRank + 1,
@prevRank := points
FROM
(
SELECT
*
FROM
(
SELECT
@curRank := 0,
@prevRank := NULL,
@incRank := 1
) AS count,
(
SELECT
a.user_id,
points
FROM
(
SELECT
user_id,
SUM(points_earned) AS points
FROM
points_earned
GROUP BY
user_id
) AS a
UNION
SELECT
user_id,
SUM(points_loss) * - 1 AS points
FROM
points_loss
GROUP BY
user_id
) AS points
GROUP BY
user_id
ORDER BY
points DESC,
user_id ASC
) AS ranking
Как a re должно быть обработано, если у 2 пользователей одинаковая сумма очков? – Philipp
Тогда он может просто заказать ASC идентификатора пользователя. – webdev
Как это выглядит, наши решения соответствуют вашим требованиям? @webdev – Philipp