我需要帮助来制定查询以根据用户操作计算点数。 存在用户表,其存储用户信息并且每个用户属于特定类别(用户类别)。每个类别都有不同的级别(比如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(参考用户类别) ...
lt_id,ul_id(参考用户级别),lt_point,lt_max
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
这给出了所有总和而没有考虑最大限制,我应该如何写,以便在该列上计算总和。 希望我的问题很清楚..任何帮助都会非常感激。
答案 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