2016-07-25 9 views
-1

獲得したポイントとポイントを失うポイントの2つのMySQLテーブルが1つあります。テーブル構造は以下のとおりです。獲得した2つのテーブルポイントとポイント損失からユーザのランクを取得

Points Earned: 
id user_id points_earned date_time 

そして

Points Loss: 
id user_id points_loss date_time 

私が獲得したポイントからの合計から来ている現状ではtotal_pointsに基づいてユーザーのランク、取得したい - ポイントの損失からの合計を。

MySQLクエリによってすべてのユーザーのランクを取得する方法を教えてください。

+0

方法2人のユーザーが同じ合計金額を持っている場合は、再処理されますか? – Philipp

+0

それでは、ユーザのIDのASC順だけにすることができます。 – webdev

+0

どのようにそれを探している、私たちのソリューションはあなたの問題に適合しましたか? @webdev – Philipp

答えて

1

使用することは、あなたがテーブルにユーザーごとに複数のpoints_loss/points_earned行を持っている場合は、このクエリを使用することができます

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 better ..私は理解していない – scaisEdge

+0

あなたの質問にあなたは単語を忘れてしまった。 – Philipp

+0

@Philippありがとうございました..回答更新 – scaisEdge

1

で参加して、グループ: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 
関連する問題