SQL查询数学体操

时间:2010-04-22 16:50:22

标签: sql mysql math

我在这里有两个关注的表:users和race_weeks。用户有很多race_week,而race_week属于User。因此,user_id是race_weeks表中的fk。

我需要在race_weeks表中的字段上执行一些具有挑战性的数学运算,以便返回具有最多时间点的用户。

以下是我们需要在race_weeks表中操作的字段。

races_won (int)
races_lost (int)
races_tied (int)
points_won (int, pos or neg)
recordable_type(varchar, Robots can race, but we're only concerned about type 'User')

为了让您完全理解在这里工作的业务逻辑,用户可以在一周内参加许多比赛。 race_week记录表示该周用户比赛的摘要结果。如果races_won,races_lost或races_tied大于0,则用户被认为是活动的一周。否则用户处于非活动状态。

所以这就是我们在查询中需要做的事情,以便返回赢得最多积分的用户(实际上是net_points_won):

  1. 计算每个用户的net_points_won(不是数据库中的字段)。

  2. 要计算net_points_won,需要(1000 * count_of_active_weeks) - sum(points__won)。 (为什么1000?想象一下,用户每周都会被发现1000分参加比赛并进入比赛。我们想要分解我们发现用户的因素,因为用户每周只能参加一场比赛100分,并且坐在900,我们会歪曲实际获得最多积分的人。)

  3. 这个有点令人费解,所以如果我能进一步澄清,请告诉我。

2 个答案:

答案 0 :(得分:0)

SELECT  user_id, 1000 * COUNT(*) - SUM(points_won) AS net_points
FROM    race_weeks
WHERE   races_won + races_lost + races_tied
        AND recordable_type = 'User'
GROUP BY
        user_id
ORDER BY
        net_points DESC

答案 1 :(得分:0)

我认为您的业务逻辑不正确:net_points应该是该用户赢得的积分总和减去用户被发现的积分数。

此外,对活动周的检查应明确地将races_wonraces_lostraces_tied测试为零,以便系统有机会在表格成为这些列时使用索引大。

SELECT user_id
     , SUM(points_won) - 1000 * COUNT(*) AS net_points
  FROM race_weeks
 WHERE recordable_type = 'User'
   AND (races_won > 0 OR races_lost > 0 OR races_tied > 0)
 GROUP BY user_id
 ORDER BY net_points DESC