首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止值因用户输入而倍增?

如何防止值因用户输入而倍增?
EN

Stack Overflow用户
提问于 2017-04-02 01:32:30
回答 1查看 34关注 0票数 0

我在做一个健身跟踪网站。用户可以添加减肥目标,并使用卡路里计算器来计算他们从某些运动中减少了多少卡路里。我已经实现了一个进度条,它可以显示用户的卡路里减少进度。它还显示了两个值,一个是用户已经丢失的总卡路里数,另一个是用户目标减少的卡路里目标值。

当我添加多个目标时,目标卡路里值是正确的,但是,显示用户减少了多少卡路里的值似乎乘以该用户输入了多少目标。

我正在努力研究如何防止这种情况发生,以及无论设定了多少目标,显示用户减少了多少卡路里的值。

例如,用户总共燃烧了1310卡路里。当用户添加第二个减肥目标时,在用户不输入任何减肥活动的情况下,该卡路里减少量将加倍至2620。

这是我用过的查询...

代码语言:javascript
复制
$sql = "SELECT 
      SUM(calories) as calories
      , CASE g.weightunit
          WHEN 'lbs' THEN 3500
          ELSE 7700
        END * weightlost  as target_calories 
    FROM (SELECT * FROM goal ORDER BY weightlost DESC) g 
        INNER JOIN tracklog t USING (userid)
    WHERE userid = ? ";
$stmt = $con->prepare($sql);
$stmt->bind_param('i', $_SESSION['userid']);
$stmt->execute();
$stmt->bind_result($calories, $target);
$res = $stmt->fetch();
EN

回答 1

Stack Overflow用户

发布于 2017-04-02 04:55:52

考虑将单元级别goal连接到aggregate level,tracklog,然后通过userid连接。现在,您在单元级别连接两者,然后聚合,沿着连接对多个匹配进行多次求和。

代码语言:javascript
复制
SELECT t.SumCalories, 
       CASE WHEN g.weightunit = 'lbs' THEN 3500 ELSE 7700 END *
           g.weightlost As Target_calories 
FROM goal g
INNER JOIN 
  (SELECT sub.userid, SUM(sub.calories) as SumCalories      
   FROM tracklog sub
   GROUP BY sub.userid) t 
USING (userid)
WHERE g.userid = ?
ORDER BY g.weightlost DESC

顺便说一句,您可能正在使用MySQL,并将ONLY_FULL_GROUP_ON设置为off,因为引擎不会通过在GROUP BY子句中没有指定的非聚集列的语法错误。

所有其他的RDBMS都会为此抛出一个错误。作为最佳实践,请始终使用GROUP BY在聚合查询中指定分组,以避免不可靠的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43159957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档