【问题标题】:Mysql SUM based on conditionMysql SUM 基于条件
【发布时间】:2017-12-07 06:40:17
【问题描述】:

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

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

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

例如,假设 User1 执行 Task1 5 次,但对于积分计算,Task1 只会计算 2 次,因此总积分为 20。这对于所有任务都是相似的。

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

用户

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

用户类别

uc_id ....

用户级别

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

这给出了所有的总和而不考虑最大限制,我应该如何编写以便在该列上计算总和。 希望我的问题足够清楚.. 任何帮助将不胜感激。

【问题讨论】:

    标签: mysql sql join group-by


    【解决方案1】:

    我相信您需要分两步完成此操作。首先将分数相加并与每种任务类型允许的最大值进行比较。确定后,将每个用户的这些结果相加。例如

    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
    ;
    

    【讨论】:

    • 抱歉,修改了不少,请确保刷新
    • 谢谢你,你拯救了我的一天。 SQL是惊人的。但我有点怀疑根据点和最大时间对记录进行分组的逻辑是什么?
    • 这里:GROUP BY ut.UT_user_id , lt_id , lt.LT_point , lt.LT_max_times
    • 第一级分组的逻辑是允许将总分与允许的最大值进行比较。
    【解决方案2】:

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

    查询未经过测试。但这种方法应该可行。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-24
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多