基于条件

时间:2017-12-07 06:40:17

标签: mysql sql join group-by

我需要帮助来制定查询以根据用户操作计算点数。 存在用户表,其存储用户信息并且每个用户属于特定类别(用户类别)。每个类别都有不同的级别(比如level1,level2等),每个级别都有一组要完成的任务(Task1,Task2 ......)。每项任务都可以多次执行。但点数是根据最大限额字段计算的。

任务1 - 10分(最大值:2 - 表示用户可以执行此任务N次,但是对于点计算,它只会被计算两次)

任务2 - 5分(最多:1)

例如,假设User1执行Task1 5次,但是对于点计算,Task1将只计算2次,因此总点数为20.这对所有任务都类似。

完成每项任务后,用户获得N分并升级到下一级。  请在下面找到表结构和查询:

用户

uid,uname,uc_id(引用用户类别),ul_id(引用用户级别并指示当前用户级别)

user_category

uc_id ....

user_level

ul_id,uc_id(参考用户类别)  ...

level_tasks

lt_id,ul_id(参考用户级别),lt_point,lt_max

user_tasks

ut_id,lt_id(引用级别任务),uid(引用用户)

以下是我到目前为止所尝试的查询:

SELECT uid, SUM(LT.lt_point/LT.lt_max) as TotalLevelPoints FROM users AS U INNER JOIN user_tasks AS UT ON UT.ut_user_id = U.id INNER JOIN level_tasks AS LT ON LT.lt_id = UT.lt_id INNER JOIN user_level AS UL ON UL.ul_id = LT.ul_id INNER JOIN user_category AS UC ON UC.uc_id = UL.uc_id WHERE UT.ut_status = 1 AND U.uid = 1 AND UL.ul_id = 1 GROUP BY U.uid

这给出了所有总和而没有考虑最大限制,我应该如何写,以便在该列上计算总和。 希望我的问题很清楚..任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:2)

我相信你需要分两步完成。首先对点进行求和,并与每种任务类型允许的最大值进行比较。确定后,将每个用户的结果相加。 e.g。

SELECT
      u.uid
    , SUM(user_task_points) AS user_task_points
FROM users AS u
INNER JOIN (
      SELECT
            ut.UT_user_id
          , lt_id
          , lt.LT_point
          , lt.LT_max_times
          , CASE WHEN SUM(lt.LT_point) > (lt.LT_point * lt.LT_max_times) THEN (lt.LT_point * lt.LT_max_times) 
                 ELSE SUM(lt.LT_point)
            END AS user_task_points
      FROM user_tasks AS ut
      INNER JOIN level_tasks AS lt ON ut.UT_rule_id = lt.LT_id
      INNER JOIN  user_level AS UL ON UL.ul_id = LT.ul_id
      WHERE ut.UT_status = 1
          AND ut.UT_user_id = 1
          AND ul.ul_id = 1
      GROUP BY
            ut.UT_user_id
          , lt_id
          , lt.LT_point
          , lt.LT_max_times
      ) AS p ON u.id = p.UT_user_id
GROUP BY
      u.uid
;

答案 1 :(得分:0)

您提供的架构和查询中的列名之间存在一些差异。我已经使用了架构。

查询未经过测试。但这种方法应该有效。

SELECT uid, SUM(LevelPoints) TotalLevelPoints
FROM ( SELECT U.uid, LT.lt_id, SUM((CASE WHEN COUNT(*) > lt_max THEN lt_max ELSE COUNT(*) END)*lt_point) LevelPoints
       FROM users U
       INNER JOIN user_tasks UT
       ON U.uid = UT.uid
       INNER JOIN level_tasks LT
       ON UT.lt_id = LT.lt_id
       GROUP BY U.uid, LT.lt_id
      )
GROUP BY uid