2016-07-25 7 views
-1

У меня есть две таблицы MySQL, одна из которых заработанные очки и одна для потери очков. Таблица структуры:Получите ранг пользователя из двух заработанных очков очков и потери очков

Points Earned: 
id user_id points_earned date_time 

И

Points Loss: 
id user_id points_loss date_time 

Я хочу, чтобы получить ранг пользователей на основе total_points в настоящее время, которая исходит из Сумма от заработанных очков - сумма от потери очков.

Как я могу получить ранг для всех пользователей по запросу MySQL.

+0

Как a re должно быть обработано, если у 2 пользователей одинаковая сумма очков? – Philipp

+0

Тогда он может просто заказать ASC идентификатора пользователя. – webdev

+0

Как это выглядит, наши решения соответствуют вашим требованиям? @webdev – Philipp

ответ

1

использование присоединиться и группа по

select a.user_id, sum(a.points_earned)- sum(b.points_loss ) 
from `Points Earned` as a 
left join `Points Loss` as b on a.user_id = b.user_id 
group by a.user_id 
+0

@Philip expalin лучше .. я не понимаю – scaisEdge

+0

В вашем запросе вы забыли слово join. – Philipp

+0

@Philipp спасибо большое .. ответ обновлен – scaisEdge

1

Если у вас есть несколько 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 
Смежные вопросы